在构建过程中,编译器会不断分配不兼容的类型。
错误消息:
error: assigning to 'int' from incompatible type 'QString'
typeduserproperty.cpp:115:28: note: in instantiation of member function 'core::TypedUserProperty<int>::setValue' requested here
示例代码
/**
* @brief setValue
* set value to property
* @param val
* value to set to property
* @return
* true - successfully set value
* false - invalid value
*/
template<class T>
void TypedUserProperty<T>::setValue(QVariant val)
{
if (std::is_same<T, int>::value == true)
{
this->_value = val.toInt();
}
else if (std::is_same<T, QString>::value == true)
{
this->_value = val.toString();
}
else if (std::is_same<T, double>::value == true)
{
this->_value = val.toDouble();
}
}
this->_value = val.toString();
是发生错误的行
“ _ value”是数据类型模板T
在这种情况下,我将T模板设置为'int'
有人知道这是为什么发生或是否有解决方法。
答案 0 :(得分:5)
问题是,即使您将模板参数指定为data
,那些int
部分也必须在编译时实例化。
您可以应用Constexpr If(自C ++ 17起)。
如果值为
else
,则丢弃statement-false(如果存在),否则,丢弃statement-true。
例如
true
答案 1 :(得分:5)
有人知道为什么会这样吗或者有什么解决方法吗?
由于您使用的是(正常)if-else
,所以即使只有一个条件为真,所有其余的else
分支也将在编译时启动。
如果您只能访问c++11,那么SFINE(即"Substitution Failure Is Not An
Error")技术以及函数重载将是一种解决方法。这将根据T
类中的类模板TypedUserProperty<T>
仅打开(即实例化)正确的方法
实例化。
#include <type_traits> // std::enable_if, std::is_same
// helper traits for `std::enable_if`
template<typename T, typename ReType = void> using EnableIfInteger = typename std::enable_if<std::is_same<T, int>::value, ReType>::type;
template<typename T, typename ReType = void> using EnableIfDouble = typename std::enable_if<std::is_same<T, double>::value, ReType>::type;
template<typename T, typename ReType = void> using EnableIfQString = typename std::enable_if<std::is_same<T, QString>::value, ReType>::type;
template<class T> class TypedUserProperty
{
T _value;
public:
template<typename Type = T> // this will be instantiated when T = int
auto setValue(QVariant val)->EnableIfInteger<Type> {
this->_value = val.toInt();
}
template<typename Type = T> // this will be instantiated when T = double
auto setValue(QVariant val)->EnableIfDouble<Type> {
this->_value = val.toDouble();
}
template<typename Type = T> // this will be instantiated when T = QString
auto setValue(QVariant val)->EnableIfQString<Type> {
this->_value = val.toString();
}
};
上述解决方案在c++17中更为详细,因为它提供了
if constexpr
特征。这样,就可以实例化唯一的分支
在编译时为true。
@songyuanyao
在他的回答中对此做了解释。