[英]C++ Template Function string type not matching?
我有一個函數定義:
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個字符串的類型不同?
你的函數getVarName()
返回一個std::string
,但你提供給_assert()
的第二個參數是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 ==
)來比較期望值和實際值,那么如果你想比較字符串,請確保你的T
和U
不是推導為const char*
; 否則,你的比較將無法達到預期效果。
你的問題是"h"
是const char*
類型,你的第二個參數是std::string
類型,所以它無法弄清楚你想要的是什么。
你應該使它們成為相同的類型:
_assert("Modifies(15, v) for v value", std::string("h"), varTable->getVarName(list.at(0)));
或改變你的功能,采取兩個不同的參數:
template<class T, class U>
inline void _assert(const string& message, T expected, U actual);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.