0
- 如何確保(類)模板的專業化實現所有 函數? (現在只有當我使用
mul
時,是否會收到錯誤消息。) - traits1/traits2的特化到int的區別是什麼?我認爲他們都是模板專業化,但traits2不接受
static
,並提供鏈接器錯誤,而不是編譯器錯誤。
#include <iostream>
template<typename T>
struct traits1{
static T add(T a, T b) { return a+b; } /* default */
static T mul(T a, T b); /* no default */
};
template<>
struct traits1<int> {
static int add(int a, int b) { return a*b; }
/* static int mul(int a, int b) missing, please warn */
};
template<typename T>
struct traits2{
static T add(T a, T b);
static T mul(T a, T b);
};
template<>
int traits2<int>::add(int a, int b) { return a*b; }
/* traits2<int>::mul(int a, int b) missing, please warn */
int main()
{
std::cout << traits1<int>::add(40, 2) << "\n";
// error: mul is not a member of traits1<int>
//std::cout << traits1<int>::mul(40, 2) << "\n";
std::cout << traits2<int>::add(40, 2) << "\n";
// error: undefined reference to traits2<int>::mul(int, int)
//std::cout << traits2<int>::mul(40, 2) << "\n";
return 0;
}
1)我想專門化所有功能,這只是測試當一個功能丟失時會發生什麼。 2)但爲什麼traits1和traits2的錯誤信息不同?我希望雙方都抱怨mul缺少(以同樣的方式) –
@MichaWiedenmann如果你專門做了所有的功能,你不會得到錯誤,所以你的問題沒有意義。 –
@MichaWiedenmann 2)這是相同的錯誤 - 「prog.cpp :(。文本+ 0x8a):未定義的引用'traits1 :: mul(int,int)' prog.cpp :(。text + 0xf2):undefined引用'traits2 :: mul(int,int)'「請參閱http://ideone.com/uCeJz –