2013-09-25 3 views
2

Некоторые код, я не имею никакого контроля над имеет ряд перегруженных функций, который принимает различные типыC++ шаблон и неоднозначный вызов функции

т.е.

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

И у меня есть шаблон функции, которая бы Idealy взять любой из этих типов и передать его правильной функции setValue.

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

Но я получаю эту ошибку

error: call to member function 'SetValue' is ambiguous 

Что я могу сделать, чтобы решить эту проблему без копирования и вставок моего кода для каждого типа, как писатели SetValue есть?

+7

Какой тип вы пытаетесь создать экземпляр ваш шаблон для? Скорее всего, это тип, который не имеет * точного * соответствия в перегруженных функциях, но более одного правильного преобразования. – jcoder

+0

Вы пытались ':: setValue ((T) value);'? – k06a

+0

Например, 'char' был бы настолько неоднозначным, насколько он мог бы получить :) – filmor

ответ

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

+0

Да нет никаких проблем с этой логикой. Кажется, моя проблема была немного иной. – user2675345