2012-10-15 48 views
1

我有一個函數,旨在將配置文件中的字符串轉換爲各種不同的類型。需要插入一個特殊情況來處理bool,因爲在使用字符串流時,「false」等同於true。使用模板進行類型轉換有奇怪的行爲

單獨的函數並不是一個真正的選項,因爲它將涉及我們正在使用的每種類型的類型檢查。

當一個類的一部分之前,該函數正常工作,但是爲了使它更易於使用,它被移入了它自己的啓動函數中。該函數在返回true時拋出2個錯誤。返回錯誤如預期的那樣。

下面是代碼示例和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的< _Elem,_Traits,_AX> :: basic_string的(常量的std :: basic_string的< _Elem,_Traits,_AX> &)':不能從轉換參數1'布爾 '到 '常量性病:: basic_string的< _Elem,_Traits,_AX> &'

錯誤2錯誤C2664:' 的std :: basic_string的< _Elem,_Traits,_AX> :: basic_string的(常量的std :: basic_string的< _Elem ,_Traits,_Ax> &)':不能將參數1從'bool'轉換爲'const std :: basic_string < _Elem,_Trai ts,_Ax> &'

+0

http://ideone.com/1ZqKf編譯好。 –

+0

調用它bool b = StringCast (「true」);在VS2010下正常工作 – marcinj

+0

@luskan不要誤導OP:http://ideone.com/0AKMJ – PiotrNycz

回答

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"); 
} 
+0

爲了擺脫鏈接器重定義錯誤,我們需要做出一些改變,但非常感謝。 –