Некоторый код, который я не контролирую, имеет несколько перегруженных функций, которые принимают разные типы
то есть
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?
определив свой собственный 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;
}
У меня нет проблем с:
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