Mój problem może być wznowione przez następujący fragment kodu:argumentem
template <typename T> struct C2;
template <typename T>
struct C1
{
template <typename Type,
template <typename Ti> class Container = C2>
void m() {}
};
template <typename T>
struct C2
{
template <typename Type = int,
template <typename Ti> class Container = C2> // <-- Here is the problem!
void m() {}
};
kompilatora GNU w wersji 4.8.1 nie powiedzie się z następującym komunikatem:
test-temp.C:16:47: error: invalid use of type ‘C2<T>’ as a default value for a template template-parameter
template <typename Ti> class Container = C2>
It odnosi się do domyślnego parametru szablonu C2 dla metody C2 :: m.
Najwyraźniej (moim zdaniem), kompilator widzi C2<T>
jako domyślny parametr zamiast C2
(bez <T>
). Tak więc, gdy znajdzie instrukcję, nie powiedzie się, ponieważ typ C2<T>
nie pasuje do Container
.
Klang ++, dla dokładnie tego samego kodu, kompiluje się dobrze!
Moje pytania:
- Który kompilator ma prawdy?
- Czy jest jakaś alternatywa dla wyrażenia tego samego sensu z bieżącą wersją kompilatora gnu?
góry dzięki
Leandro
g ++ jest niepoprawny, clang jest poprawny, również nazwa w szablonie szablonu jest opcjonalna – aaronman