【发布时间】:2015-07-24 15:50:21
【问题描述】:
目前我有一个这样定义的成员函数:
template<typename T> bool updateParameter(const std::string& name, const T& data);
指针重载。
template<typename T> bool updateParameter(const std::string& name, T* data);
我希望能够像这样使用这个功能:
int test = 20;
updateParameter<int>("name", 0);
updateParameter<int>("Referenced parameter", &test);
这样我可以拥有一个参数对象,它要么拥有它所代表的数据,要么指向用户拥有的成员。
现在我遇到的问题是当前设置 MSVC 会隐式地将“名称”的 const 0 转换为指针,因此它最终会调用为指针设计的重载。我可以使用显式关键字,但是我无法将 name 参数从 const char[] 隐式转换为 std::string。 有没有办法告诉编译器、MSVC 和 GCC 某个字段不应该被隐式转换,或者至少让它更喜欢 const T& 版本而不是 T* 版本?
【问题讨论】:
-
我试图复制你的问题,但对我来说 GCC 4.8.4 和 VS2010 都正常运行。
-
const T&重载绝对应该优先于0,即使您没有指定<int>。我无法在任何编译器上重现。 -
按预期工作here。
标签: c++ templates overloading implicit explicit