我在这段代码上遇到了问题:
template <typename T>
void dosth(T& value,const T& default_value)
{
if (condition)
value = 10;
else
value = default_value;
}
当我用
打电话时enum {
SITUATION1,
STIUATION2
};
int k;
dosth(k,SITUATION1);
编译器(g ++ 4.5)说
没有用于调用'dosth(int&amp;,)'
的匹配函数
为什么编译器不会自动将枚举转换为int?
答案 0 :(得分:12)
Your problem是因为模板无法从您提供的函数参数中实例化。没有隐式转换为int
,因为根本无法调用 。
如果您投射而不是尝试依赖隐式转换,your program will work:
dosth(k, static_cast<int>(SITUATION1));
或者,如果您明确提供函数模板的参数,那么函数参数将按预期隐式转换,并your program will work:
dosth<int>(k, SITUATION1);
答案 1 :(得分:2)
这对于枚举会更好吗?
class Situations
{
private:
const int value;
Situations(int value) : value(value) {};
public:
static const Situations SITUATION1() { return 1; }
static const Situations SITUATION2() { return 2; }
int AsInt() const { return value; }
};
将启用类型安全。然后用它来创建一个类型的安全模板。
即。通过或失败的价值。