簡體   English   中英

C ++模板函數字符串類型不匹配?

[英]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 == )來比較期望值和實際值,那么如果你想比較字符串,請確保你的TU不是推導為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM