Some code I have no control over has a number of overloaded functions which accepts different types

i.e.

setValue(int)
setValue(std::string)
setValue(bool)

And I have a template function which would idealy take any one of these types and pass it on to the correct setValue function.

template <class T>
do_something(T value) {
    ...
    setValue(value);

But I get this error

error: call to member function 'SetValue' is ambiguous

Is there anything I can do to work around this problem without copy and pasting my code for each type like the writers of setValue have?

有帮助吗?

解决方案

by defining you own SetValue with exact match and forwarding to the correct overload.

void setValue(int i) { setValue(static_cast<double>(i)) }

or (if you have a lot of "setValue" functions with same type) you may help the compiler to choose which overload to use like this:

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

其他提示

I have no problems with:

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);
}

Here is my run: http://codepad.org/1wq8qd7l

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top