mul
时才收到错误消息。)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;
}
答案 0 :(得分:2)
1)如果您想要的只是一个特定函数的不同行为,请不要专门化整个类。单独专注于这个功能:
template<>
int traits1<int>::add(int a, int b) { return a*b; }
您无法确保专业化实现所有模板方法,因为它们是无关的。
2)你没有提供traits2::mul
的定义,所以当然你得到链接器错误 - 声明就在那里。