2012-12-20 30 views
6

Używam gcc/4.7 i potrzebuję utworzyć instancję klasy z argumentem szablonu szablonu w funkcji szablonu (lub funkcji członka). Otrzymuję następujący błądKod szablonu szablonu nie działa

test.cpp: In function 'void setup(Pattern_Type&)': 
test.cpp:17:34: error: type/value mismatch at argument 1 in template parameter list for 'template<template<class> class C> struct A' 
test.cpp:17:34: error: expected a class template, got 'typename Pattern_Type::traits' 
test.cpp:17:37: error: invalid type in declaration before ';' token 
test.cpp:18:5: error: request for member 'b' in 'a', which is of non-class type 'int' 

komentując dwie linie oznaczone we fragmencie uruchamia kod, więc A a może być instancja w „głównym”, ale nie w „setup”. Myślę, że byłoby to interesujące także dla innych osób i byłbym naprawdę szczęśliwy mogąc zrozumieć powód, dla którego kod nie działa. Oto kod

struct PT { 
    template <typename T> 
    struct traits { 
    int c; 
    }; 
}; 

template <template <typename> class C> 
struct A { 
    typedef C<int> type; 
    type b; 
}; 

template <typename Pattern_Type> 
void setup(Pattern_Type &halo_exchange) { 
    A<typename Pattern_Type::traits> a; // Line 17: Comment this 
    a.b.c=10; // Comment this 
} 

int main() { 
    A<PT::traits> a; 

    a.b.c=10; 

    return 0; 
} 

Dzięki za wszelkie sugestie i poprawki! Mauro

+0

Kompiluje pod MSVC10. –

Odpowiedz

9

Trzeba zaznaczyć Pattern_Type::traits jako szablonu:

A<Pattern_Type::template traits> a; 

Jest to konieczne, ponieważ jest zależna od parametru szablonu Pattern_Type.

Nie należy również używać typename, ponieważ traits jest szablonem, a nie typem.

+0

To jest kombinacja, której nie próbowałem: szablon bez nazwy pliku. Nadal nie jest dla mnie jasne, dlaczego w "głównym" nie muszę określać "szablonu". Dzięki za super szybką odpowiedź! – user1919074

+1

@ user1919074: To dlatego, że w 'main' nie jest zależny od parametru szablonu (tzn. Zawartość' PT' jest już znana, ale zawartość 'Pattern_Type' nie jest znana, ponieważ może być dowolna). Aby uzyskać więcej informacji, zobacz [Gdzie i dlaczego muszę wstawić słowa kluczowe "szablon" i "typename"?] (Http://stackoverflow.com/questions/610245/where-and-why-do-i-have- to-put-the-template-and-typename-keywords) – interjay

+0

Zgadza się, powinienem był to wiedzieć ... – user1919074

Powiązane problemy