您好,我在部分专业化方面遇到问题。我想要做的是拥有一个具有模板成员函数的类,该函数会将给定值解释为用户指定的值。例如类名是Value
这是我想做的事情的一个片段:
int *ptr1 = new int;
*ptr1 = 10;
Value val1 = ptr1;
int *ptr2 = val1.getValue<int*>();
Value val2 = 1;
int testVal = val2.getValue<int>();
这是我实现此类的方法:
struct Value {
Value(void *p) : val1(p){}
Value(int i) : val2(i){}
template<typename T>
T getValue();
void *val1;
int val2;
};
template<typename T>
T* Value::getValue<T*>() {
return reinterpret_cast<T*>(val1);
}
template<>
int Value::getValue<int>() {
return val2;
}
当我编译时,我收到以下错误:
错误 C2768:'Value::getValue':非法使用显式模板
论点
基本上它抱怨代码的指针模板部分:
template<typename T>
T* Value::getValue<T*>() {
return reinterpret_cast<T*>(val1);
}
我知道这个问题可以通过一个简单的联合来实现,但是这段代码是一个更大代码的精简版本。
有人知道问题可能是什么吗?我想做的是将使用指针时的一段代码和不使用指针时的另一段代码分开。我真的很困惑,我总是调查而不是询问,但我还没有找到任何关于它的好信息。
函数模板不能部分专业化,但大多数时候,您可以使用委托到类技巧。在你的例子中,它会是这样的:
struct Value {
template<typename T>
T getValue() {
return Impl_getValue<T>::call(*this);
}
};
template <typename T>
struct Impl_getValue
{
static T call(Value &v) {
//primary template implementation
}
};
template <typename T>
struct Impl_getValue<T*>
{
static T* call(Value &v) {
return reinterpret_cast<T*>(v.val1);
}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)