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が、指定する 2 番目の引数_assert()の型はconst char[]( に減衰しconst char*ます)。

2 つの型は同一ではないため、型推定では の有効な一致を見つけることができません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で等値比較 ( ) を使用して期待値と実際の値を比較している場合、文字列を比較する場合は、 TandUが推定されないようにしてください。const char*そうしないと、比較が期待どおりに行われません。

于 2013-02-28T14:52:24.093 に答える
0

あなたの問題はそれ"h"が型const char*であり、2番目のパラメーターが型でstd::stringあるため、どちらが必要かを判断できません。

それらを同じタイプにする必要があります。

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

または、関数を変更して、2 つの異なるパラメーターを取るようにします。

template<class T, class U> 
inline void _assert(const string& message, T expected, U actual);
于 2013-02-28T14:52:46.683 に答える