模版 无法显式专用化

时间:2023-01-10 22:54:46

#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


该回复于2012-03-27 15:27:48被版主删除

#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


引用 4 楼 pengzhixi 的回复:
或者
C/C++ code
template<typename T>
class tmp
{
public :
    T max(const T&amp;,const T&amp;);
};

template<typename T>
T tmp<T>::max(const T&amp;a,const T&amp; b)
{
    cout << "普通版本"<<endl;
    re……


特化版本的不需要 加template<> 而且还不能放在同一个文件中

#6


函数模版不需要特化, 用的是重载.

#7


显式特化从来没在工作中用过。

#8


去看看c++ template吧。里面对于特化的类的成员函数的定义方式有说明的。
对于特化的类的成员函数必须像普通的成员函数那样定义。每一个T出现的地方都必须用特化的类型代替。

#9


该回复于2012-03-27 17:16:22被版主删除

#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


该回复于2012-03-27 15:27:48被版主删除

#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


引用 4 楼 pengzhixi 的回复:
或者
C/C++ code
template<typename T>
class tmp
{
public :
    T max(const T&amp;,const T&amp;);
};

template<typename T>
T tmp<T>::max(const T&amp;a,const T&amp; b)
{
    cout << "普通版本"<<endl;
    re……


特化版本的不需要 加template<> 而且还不能放在同一个文件中

#6


函数模版不需要特化, 用的是重载.

#7


显式特化从来没在工作中用过。

#8


去看看c++ template吧。里面对于特化的类的成员函数的定义方式有说明的。
对于特化的类的成员函数必须像普通的成员函数那样定义。每一个T出现的地方都必须用特化的类型代替。

#9


该回复于2012-03-27 17:16:22被版主删除