我无法控制的一些代码有许多重载函数,它们接受不同的类型
即
setValue(int)
setValue(std::string)
setValue(bool)
我有一个模板函数,它可以理想地采用这些类型中的任何一个并将其传递给正确的setValue函数。
template <class T>
do_something(T value) {
...
setValue(value);
但是我收到了这个错误
error: call to member function 'SetValue' is ambiguous
我是否可以做任何事情来解决这个问题,而无需像setValue的编写者那样复制和粘贴我的代码?
答案 0 :(得分:0)
我没有遇到任何问题:
void setValue(int a)
{
}
void setValue(std::string a)
{
}
void setValue(bool a)
{
}
template <class T>
void func(T value)
{
setValue(value);
}
int main()
{
func(5);
}
这是我的运行:http://codepad.org/1wq8qd7l
答案 1 :(得分:0)
通过定义您自己的具有完全匹配的SetValue并转发到正确的重载。
void setValue(int i) { setValue(static_cast<double>(i)) }
或(如果你有很多相同类型的“setValue”函数)你可以帮助编译器选择使用哪个重载:
void setValue(char a);
void setValue(double a);
template <typename T>
struct TypeToUseFor
{
typedef T type;
};
template <>
struct TypeToUseFor<int>
{
typedef double type;
};
template <class T>
void func(T value)
{
setValue(static_cast<typename TypeToUseFor<T>::type>(value));
// setValue(value);
}
int main() {
func(0); // int -> ?
func('0'); // exact match
func(0.0); // exect match
func(0.f); // float -> double
return 0;
}