我正在尝试创建类似于Qt的QVariant的Variant类。我考虑过std :: variant和std :: any,但是不幸的是,我需要类似于QVariant :: value()函数的东西。但是,我找不到没有这样的错误的方法来实现该功能:
note: candidate: template<class T> T Variant::value() const
inline T value() const {
^~~~~
note: template argument deduction/substitution failed:
note: couldn't deduce template parameter ‘T’
这个answer似乎是我想要的,但是我试图理解为什么该实现在返回类型上没有收到“推导模板参数'T'”错误的情况下有效。任何帮助将不胜感激。谢谢。
这是我的.H:
class Variant {
private:
enum VariantType {
CHAR = 0,
UCHAR,
SCHAR,
SHORT,
USHORT,
INT,
UINT,
LONG,
ULONG,
LONGLONG,
ULONGLONG,
BOOL,
FLOAT,
DOUBLE,
LONGDOUBLE
};
public:
explicit Variant(int i);
explicit Variant(double d);
int ToInt() const;
double ToDouble() const;
private:
struct Internal {
Internal(VariantType typeIn) :
type(typeIn) {
}
union {
char c;
unsigned char uc;
short s;
signed char sc;
unsigned short us;
int i;
unsigned int ui;
long l;
unsigned long ul;
long long ll;
unsigned long long ull;
bool b;
float f;
double d;
long double ld;
void *ptr;
} value;
VariantType type;
};
Internal _data;
public:
template<typename T>
inline T value() const {
// try to get int/double working first
if (_data.type == VariantType::DOUBLE) {
return _data.value.d;
} else if (_data.type == VariantType::INT) {
return _data.value.i;
}
}
};
这是我的.CPP:
Variant::Variant(int i) : _data(INT) {
_data.value.i = i;
}
Variant::Variant(double d) : _data(DOUBLE) {
_data.value.d = d;
}
int Variant::ToInt() const {
return _data.value.i;
}
double Variant::ToDouble() const {
return _data.value.d;
}
编辑。
答案 0 :(得分:3)
错误来自您的呼叫站点,而不是类定义。该错误告诉您Variant::value<T>()
需要一个<T>
,但是您没有提供任何用于实例化value<T>
的类型参数。
此限制同样适用于QtVariant
,并非您的班级独有。