2 回答
TA贡献1802条经验 获得超10个赞
那样行不通。您需要说以下内容,但这是不正确的
template <class C> template<>
void X<C>::get_as<double>()
{
}
明确专门的成员也需要其周围的类模板也明确专门。因此,您需要说以下内容,这将仅使的成员专用X<int>。
template <> template<>
void X<int>::get_as<double>()
{
}
如果要使周围的模板不专业,则有多种选择。我更喜欢超载
template <class C> class X
{
template<typename T> struct type { };
public:
template <class T> void get_as() {
get_as(type<T>());
}
private:
template<typename T> void get_as(type<T>) {
}
void get_as(type<double>) {
}
};
TA贡献1898条经验 获得超8个赞
如果可以使用,std::enable_if我们可以依靠SFINAE(替代失败不是错误)
会像这样工作:
#include <iostream>
#include <type_traits>
template <class C> class X
{
public:
template <class T, typename std::enable_if< ! std::is_same<double,T>::value>::type * = nullptr > void get_as(){
std::cout << "get as T" << std::endl;
}
template <class T, typename std::enable_if< std::is_same<double,T>::value>::type * = nullptr > void get_as(){
std::cout << "get as double" << std::endl;
}
};
int main()
{
X<int> d;
d.get_as<double>();
return 0;
}
丑陋的是,对于所有这些enable_if来说,编译器仅需要一种专门化功能,否则就会产生歧义错误。这就是为什么默认行为“ get as T”也需要启用的原因。
- 2 回答
- 0 关注
- 537 浏览
添加回答
举报