Pregunta

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?

¿Fue útil?

Solución

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

Otros consejos

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top