Я тестировал идею с помощью шаблонов переменных в C ++ с использованием Code :: Blocks, и когда я пытаюсь скомпилировать его, сборка завершается неудачно и говорит:
'
in dependent_type_p, at cp/pt.c:19367
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://tdm-gcc.tdragon.net/bugs> for instructions.
Process terminated with status 1 (0 minute(s), 1 second(s))
0 error(s), 0 warning(s) (0 minute(s), 1 second(s))
Я следовал инструкциям и представил отчет об ошибке, но пока хочу узнать, нужно ли мне исправить мой код или получить новый компилятор. Код, который я написал:
#include <iostream>
#include <array>
using namespace std;
struct Foo1
{
struct init {};
};
struct Foo2 : public Foo1
{
struct init{};
};
struct Foo3 : public Foo2
{
struct init{};
};
template <typename... Args>
void Bar(typename Args::init... args)
{
array<void*, sizeof...(Args) + 2> t = {nullptr, &args..., nullptr};
for (size_t x = 1; x < sizeof...(Args) + 1; ++x)
cout << t[x] << endl;
}
int main()
{
Foo1::init a;
Foo2::init b;
Foo3::init c;
Bar<Foo1, Foo2, Foo3>(a, b, c);
}
Это работает, если я вручную расширить Bar
чтобы:
template <typename A, typename B, typename C>
void Bar(typename A::init a, typename B::init b, typename C::init c)
{
array<void*, 5> t = {nullptr, &a, &b, &c, nullptr};
for (size_t x = 1; x < 4; ++x)
cout << t[x] << endl;
}
Ошибка как-то вызвана шаблоном variadic, но я его совсем не понимаю. Я не решался спросить, потому что мы должны были указать точную проблему, но все, что сказал компилятор, было связано с зависимым типом.
Это (очевидно, не сообщенная) ошибка в GCC 4.7 (код приводит к тому, что GCC 4.5 и 4.6 тоже приводят к ICE, но другим и даже более веселым способом, а именно Internal compiler error: Error reporting routines re-entered.
).
Если кто-то еще нажмет на это — просто обновитесь до GCC 4.8 или новее, где это было исправлено.