Вы должны указать компилятору, какую версию использовать. В C ++ вы можете сделать это тремя способами.
Явно дифференцируйте звонки, набрав
Вы несколько обманули, потому что отправили целое число в функцию, ожидающую символ, и ошибочно отправили число шесть, когда значение символа '6' не 6, а 54 (в ASCII):
std::string mul(char c, int n) { return std::string(n, c); }
std::string s = mul(6, 3); // s = "666"
Правильное решение было бы, конечно,
std::string s = mul(static_cast<char>(54), 3); // s = "666"
Думаю, это стоило упомянуть, даже если вы не хотели решения.
Явно дифференцирует вызовы по фиктивному указателю
Вы можете добавить фиктивный параметр для каждой функции, заставляя компилятор выбирать правильные функции. Самый простой способ - отправить фиктивный указатель NULL типа, требуемого для возврата:
int mul(int *, int i, int j) { return i*j; }
std::string mul(std::string *, char c, int n) { return std::string(n, c); }
Который можно использовать с кодом:
int n = mul((int *) NULL, 6, 3); // n = 18
std::string s = mul((std::string *) NULL, 54, 3); // s = "666"
Явно дифференцируйте вызовы путем шаблонирования возвращаемого значения
С помощью этого решения мы создаем «фиктивную» функцию с кодом, который не будет компилироваться, если будет создан экземпляр:
template<typename T>
T mul(int i, int j)
{
// If you get a compile error, it's because you did not use
// one of the authorized template specializations
const int k = 25 ; k = 36 ;
}
Вы заметите, что эта функция не будет компилироваться, что хорошо, потому что мы хотим использовать только некоторые ограниченные функции через специализацию шаблона:
template<>
int mul<int>(int i, int j)
{
return i * j ;
}
template<>
std::string mul<std::string>(int i, int j)
{
return std::string(j, static_cast<char>(i)) ;
}
Таким образом, будет скомпилирован следующий код:
int n = mul<int>(6, 3); // n = 18
std::string s = mul<std::string>(54, 3); // s = "666"
Но этот не будет:
short n2 = mul<short>(6, 3); // error: assignment of read-only variable ‘k’
Явно дифференцируйте вызовы путем шаблонирования возвращаемого значения, 2
Эй, ты тоже обманул!
Правильно, я использовал одни и те же параметры для двух "перегруженных" функций. Но вы начали обманывать (см. Выше) ...
^ _ ^
Если серьезно, если вам нужны разные параметры, вам нужно написать больше кода, а затем явно использовать правильные типы при вызове функций, чтобы избежать неоднозначностей:
// For "int, int" calls
template<typename T>
T mul(int i, int j)
{
// If you get a compile error, it's because you did not use
// one of the authorized template specializations
const int k = 25 ; k = 36 ;
}
template<>
int mul<int>(int i, int j)
{
return i * j ;
}
// For "char, int" calls
template<typename T>
T mul(char i, int j)
{
// If you get a compile error, it's because you did not use
// one of the authorized template specializations
const int k = 25 ; k = 36 ;
}
template<>
std::string mul<std::string>(char i, int j)
{
return std::string(j, (char) i) ;
}
И этот код будет использоваться как таковой:
int n = mul<int>(6, 3); // n = 18
std::string s = mul<std::string>('6', 3); // s = "666"
И следующая строка:
short n2 = mul<short>(6, 3); // n = 18
Все равно не скомпилируется.
Заключение
Я люблю C ++ ...
: - р