C ++模板和模糊函数调用

时间:2013-09-25 08:31:34

标签: c++ templates ambiguous-call

我无法控制的一些代码有许多重载函数,它们接受不同的类型

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的编写者那样复制和粘贴我的代码?

2 个答案:

答案 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;
}