#include <string>
template<typename T>
class tmp
{
public :
T max(const T&,const T&);
};
template<typename T>
T tmp<T>::max(const T&a,const T& b)
{
cout << "普通版本"<<endl;
return a;
}
template<>
class tmp<std::string>
{
public:
std::string max(const std::string&,const std::string&);
};
template<>
std::string tmp<std::string>::max(const std::string& a,const std::string& b)
{
cout << "特化版本"<<endl;
return a;
}
error C2910: “tmp<std::string>::max”: 无法显式专用化
特化模版的max函数有什么错误吗?
9 个解决方案
#1
template<typename T>
class tmp
{
public :
T max(const T&,const T&);
};
template<typename T>
T tmp<T>::max(const T&a,const T& b)
{
cout << "普通版本"<<endl;
return a;
}
template<>
class tmp<std::string>
{
public:
std::string max(const std::string&,const std::string&){
cout << "特化版本"<<endl;
return "hello";
}
};
#2
#3
#include <string>
template<typename T>
class tmp
{
public :
T max(const T&,const T&);
};
template<typename T>
T tmp<T>::max(const T&a,const T& b)
{
cout << "普通版本"<<endl;
return a;
}
template<>
class tmp<std::string>
{
public:
std::string max(const std::string&,const std::string&);
};
std::string tmp<std::string>::max(const std::string& a,const std::string& b)
{
cout << "特化版本"<<endl;
return a;
}
函数模版不能特化,只能重载, 去掉 template<> 变成重载就 OK 了.
#4
或者
template<typename T>
class tmp
{
public :
T max(const T&,const T&);
};
template<typename T>
T tmp<T>::max(const T&a,const T& b)
{
cout << "普通版本"<<endl;
return a;
}
template<>
class tmp<std::string>
{
public:
std::string max(const std::string&,const std::string&);
};
std::string tmp<std::string>::max(const std::string& a,const std::string& b)
{
cout << "特化版本"<<endl;
return "hello";
}
#5
特化版本的不需要 加template<> 而且还不能放在同一个文件中
#6
函数模版不需要特化, 用的是重载.
#7
显式特化从来没在工作中用过。
#8
去看看c++ template吧。里面对于特化的类的成员函数的定义方式有说明的。
对于特化的类的成员函数必须像普通的成员函数那样定义。每一个T出现的地方都必须用特化的类型代替。
对于特化的类的成员函数必须像普通的成员函数那样定义。每一个T出现的地方都必须用特化的类型代替。
#9
#1
template<typename T>
class tmp
{
public :
T max(const T&,const T&);
};
template<typename T>
T tmp<T>::max(const T&a,const T& b)
{
cout << "普通版本"<<endl;
return a;
}
template<>
class tmp<std::string>
{
public:
std::string max(const std::string&,const std::string&){
cout << "特化版本"<<endl;
return "hello";
}
};
#2
#3
#include <string>
template<typename T>
class tmp
{
public :
T max(const T&,const T&);
};
template<typename T>
T tmp<T>::max(const T&a,const T& b)
{
cout << "普通版本"<<endl;
return a;
}
template<>
class tmp<std::string>
{
public:
std::string max(const std::string&,const std::string&);
};
std::string tmp<std::string>::max(const std::string& a,const std::string& b)
{
cout << "特化版本"<<endl;
return a;
}
函数模版不能特化,只能重载, 去掉 template<> 变成重载就 OK 了.
#4
或者
template<typename T>
class tmp
{
public :
T max(const T&,const T&);
};
template<typename T>
T tmp<T>::max(const T&a,const T& b)
{
cout << "普通版本"<<endl;
return a;
}
template<>
class tmp<std::string>
{
public:
std::string max(const std::string&,const std::string&);
};
std::string tmp<std::string>::max(const std::string& a,const std::string& b)
{
cout << "特化版本"<<endl;
return "hello";
}
#5
特化版本的不需要 加template<> 而且还不能放在同一个文件中
#6
函数模版不需要特化, 用的是重载.
#7
显式特化从来没在工作中用过。
#8
去看看c++ template吧。里面对于特化的类的成员函数的定义方式有说明的。
对于特化的类的成员函数必须像普通的成员函数那样定义。每一个T出现的地方都必须用特化的类型代替。
对于特化的类的成员函数必须像普通的成员函数那样定义。每一个T出现的地方都必须用特化的类型代替。