2013-02-28 43 views
0

我定義的函數:C++模板函數字符串類型不匹配?

template<class T> 
inline void _assert(const string& message, T expected, T actual); 

我一直在使用它來斷言2個整數是平等的。但是,當我有:

_assert("Modifies(15, v) for v value", "h", varTable->getVarName(list.at(0))); 
              ^returns std::string 

它不工作:

Error 1 error C2782: 'void _assert(const std::string &,T,T)' : template parameter 'T' is ambiguous h:\dropbox\sch\cs3202\code\test\testqueryevaluator\testgetcandidatelist.cpp 183 

爲什麼? 2個字符串不是同一類型?

+0

因爲一個參數是一個'爲const char *',而另一種'的std :: string'。 – 2013-02-28 14:52:14

回答

2

你你提供給_assert()功能getVarName()返回std::string,但第二個參數是const char[]類型(衰變爲const char*)的。

這兩種類型不相同,因此類型扣除無法找到T的有效匹配項。

爲了解決這個問題,你可以換你的字符串文字"h"std::string對象:

_assert(
    "Modifies(15, v) for v value", 
    string("h"), // <== Wrap the string literal 
    varTable->getVarName(list.at(0)) 
    ); 

或者你可以只修改_assert()函數模板,以便它不會強制預期值和實際值是同類型:

template<typename T, typename Y> 
inline void _assert(const string& message, T expected, U actual); 

但請注意:如果您正在使用內部_assert相等比較(operator ==)比較預期值和實際值,讓河畔如果你想比較字符串,你的TU不會被推斷爲const char*;否則,你的比較不會達到你的預期。

+0

'std :: string string(「h」); assert(「h」== string.c_str());'失敗(指針比較)。所以放棄第一個例子,而是使用'std :: string'比較。 – Zeta 2013-02-28 15:05:57

+0

@ Zeta:正確。沒有考慮到'_assert'會通過平等做比較。讓我編輯 – 2013-02-28 15:09:54

+0

實際上,我猜你可以通過使用'static_assert(std :: is_convertible :: value,「無法在_assert中將T轉換爲U)」來調出最後一個版本; _assert(message,expected,T(actual));'或類似的東西。 – Zeta 2013-02-28 15:12:47

0

你的問題是"h"const char*類型,你的第二個參數是std::string類型,所以它不能找出你想要的。

你應該讓他們相同的類型:

_assert("Modifies(15, v) for v value", std::string("h"), varTable->getVarName(list.at(0))); 

或更改功能,採取兩種不同的PARAMS:

template<class T, class U> 
inline void _assert(const string& message, T expected, U actual); 
相關問題