我有一个函数,旨在将字符串从配置文件转换为各种不同的类型。需要插入一个特殊情况来处理bool,因为“false”在使用字符串流时等于true。
单独的函数实际上不是一个选项,因为它涉及我们正在使用的每种类型的类型检查。
当一个类的一部分之前,该函数正常工作,但是为了使它更有用,它被移入了它自己的启动函数。该函数在返回true上抛出2个错误。返回false是正常的。
下面是代码示例和visual studio抛出的错误。
template <typename T>
static T StringCast(string inValue)
{
if(typeid(T) == typeid(bool))
{
if(inValue == "true")
return true;
if(inValue == "false")
return false;
if(inValue == "1")
return true;
if(inValue == "0")
return false;
return false;
}
std::istringstream stream(inValue);
T t;
stream >> t;
return t;
}
错误1错误C2664:'std :: basic_string&lt; _Elem,_Traits,_Ax&gt; :: basic_string(const std :: basic_string&lt; _Elem,_Traits,_Ax&gt;&amp;)':无法将参数1从'bool'转换为'const std :: basic_string&lt; _Elem,_Traits,_Ax&gt; &安培;'
错误2错误C2664:'std :: basic_string&lt; _Elem,_Traits,_Ax&gt; :: basic_string(const std :: basic_string&lt; _Elem,_Traits,_Ax&gt;&amp;)':无法将参数1从'bool'转换为'const std :: basic_string&lt; _Elem,_Traits,_Ax&gt; &安培;'
答案 0 :(得分:2)
如果你想为bool专门化 - 那么只需为bool定义专业化。你的方式是不可能的。使用下面的正确方法:
template <typename T>
T StringCast(string inValue)
{
std::istringstream stream(inValue);
T t;
stream >> t;
return t;
}
template <>
bool StringCast<bool>(string inValue)
{
if(inValue == "true")
return true;
if(inValue == "false")
return false;
if(inValue == "1")
return true;
if(inValue == "0")
return false;
return false;
}
int main() {
int a = StringCast<int>("112");
bool b = StringCast<bool>("true");
}