3

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

IE

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 的作者那样复制和粘贴每种类型的代码?

4

2 回答 2

1

通过定义您拥有的完全匹配的 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;
}
于 2013-09-25T09:26:49.413 回答
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

于 2013-09-25T08:46:00.637 回答