2010-01-06 140 views
1

我有歸結爲以下代碼:C++模板專業化問題

//Just a templated array class .. implementation doesn't matter 
template<int N> 
struct Array {}; 

//A simple Traits like class 
template<typename T> 
struct MyTraits {} 

//Specialization of the traits class 
template<int N> 
struct Foo< Array<N> > 
{ 
    static void monkey() {}; 
} 

int main() 
{ 
    Foo< Array<3> >::monkey(); 
} 

不幸的是,編譯器不喜歡它... ...

test.cpp: In function ‘int main()’: 
test.cpp|17| error: ‘monkey’ is not a member of ‘Foo<Array<3> >’ 

我在做什麼錯了,怎麼辦我修復它? 感謝

+1

我錯過了什麼,或者你不使用你的特質課程? 'Foo'應該是'MyTraits'嗎? – GManNickG 2010-01-06 07:28:53

回答

7

對我來說,以下工作:

//Just a templated array class .. implementation doesn't matter 
template<int N> 
struct Array {}; 

//A simple Traits like class 
template<typename T> 
struct MyTraits {}; 

//Specialization of the traits class 
template<int N> 
struct MyTraits< Array<N> > 
{ 
    static void monkey() {}; 
}; 

int main() 
{ 
    MyTraits< Array<3> >::monkey(); 
} 

你有Foo不正確,你可以看到我改變了它相匹配的意見的方式。另外,在聲明Foo/MyTraits之後您還有一個缺失的分號。最後,對於數組類,我建議您使用size_t作爲N的類型。

+0

你在這些問題上發現。他們大多是由複製,粘貼和修復​​問題引起的。看起來像我的問題在別的地方:( – 2010-01-06 07:58:58

+0

隨意發佈更多的代碼,最好是真正的代碼:)我們想讓你的問題得到解決。 – GManNickG 2010-01-06 08:13:55

1

如果你感興趣的問題是這樣的:

template<unsigned int N> 
class V {}; 

template<typename T> 
struct MyTraits 
{ 
}; 

template< int N> 
struct MyTraits< V<N> > 
{ 
    static void monkey(); 
}; 

int main() 
{ 
    MyTraits< V<4> >::monkey(); 
} 

生成此錯誤

error: ‘monkey’ is not a member of ‘MyTraits<V<4u> >’ 

這引起模板類型之間的不匹配是在一個地方和一個int一個unsigned int在另一個。 (醜類)

改變性狀的專業化是

template< unsigned int N> 
struct MyTraits< V<N> > 
{ 
    static void monkey(); 
}; 

使一切工作。 (由於V的定義在第三方代碼中,所以此問題變得模糊)。