2012-12-20 104 views
6

我用gcc/4.7,我需要實例化的模板函數(或成員函數)的模板,模板參數的類。我收到以下錯誤模板模板代碼不工作

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' 

通過註釋標註在片段中的兩行代碼運行,所以一個能在「主」,但不是「設置」實例化。我想,這將是爲其他人的利益,我會很高興地理解爲什麼代碼不起作用的原因。這裏的代碼

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; 
} 

感謝您的任何建議和修復! 莫羅

+0

是否MSVC10下編譯。 –

回答

9

您需要標記Pattern_Type::traits爲模板:

A<Pattern_Type::template traits> a; 

這是必要的,因爲它是依賴於模板參數Pattern_Type

你也不應使用typename那裏,因爲traits是一個模板,而不是一個類型。

+0

這是一個組合,我沒有嘗試:模板而不類型名稱。不過我不清楚爲什麼在「主」我並不需要指定「模板」。感謝超級快速回答! – user1919074

+1

@ user1919074:這是因爲在'main'中它不依賴於模板參數(即PT的內容已經知道,但Pattern_Type的內容未知,因爲它可能是任何東西)。有關更多信息,請參閱[我在哪裏以及爲什麼必須放置「模板」和「類型名稱」關鍵字?](http://stackoverflow.com/questions/610245/where-and-why-do-i-have- to-put-the-template-and-typename-keywords) – interjay

+0

沒錯,我應該知道這個... – user1919074