您好,我遇到部分专业化问题。我想要做的是拥有一个具有模板成员函数的类,该函数将给定值解释为用户指定的值。例如,类名是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);
}
我知道这个问题可以通过简单的联合实现,但是这段代码是更大代码的精简版。
有人知道问题可能是什么吗?我想要做的是在使用指针时分离一个代码,而在不使用指针时分开。我真的被困住了,而且我总是调查而不是询问,但我没有找到任何关于它的好信息。
答案 0 :(得分:13)
函数模板不能部分专门化,但大多数情况下,您可以使用委托到类的技巧。在你的例子中,它将是这样的:
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);
}
};