0

我定义了一个函数:

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个字符串不是同一类型?

4

2 回答 2

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);

但请注意:如果您在operator ==内部使用相等比较 ( )来比较预期值和实际值,请确保如果要比较字符串,请_assert确保您的TU不被推断为;const char*否则,您的比较将不会达到您的预期。

于 2013-02-28T14:52:24.093 回答
0

你的问题是它"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);
于 2013-02-28T14:52:46.683 回答