Я сталкиваюсь с неприятной загадкой в моей кодовой базе. Я не могу точно сказать, почему мой код генерирует эту ошибку, но (например) std :: string нет.
class String {
public:
String(const char*str);
friend String operator+ ( const String& lval, const char *rval );
friend String operator+ ( const char *lval, const String& rval );
String operator+ ( const String& rval );
};
Внедрение этого достаточно легко представить самостоятельно.
Моя программа драйвера содержит следующее:
String result, lval("left side "), rval("of string");
char lv[] = "right side ", rv[] = "of string";
result = lv + rval;
printf(result);
result = (lval + rv);
printf(result);
, которая генерирует следующую ошибку в gcc 4.1.2:
driver.cpp:25: error: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
String.h:22: note: candidate 1: String operator+(const String&, const char*)
String.h:24: note: candidate 2: String String::operator+(const String&)
Пока все хорошо, верно? К сожалению, мой конструктор String (const char * str) настолько удобен для использования в качестве неявного конструктора, что использование явного ключевого слова для решения этой проблемы может вызвать другие проблемы.
Более того ... std :: string не нужно прибегать к этому, и я не могу понять, почему. Например, в basic_string.h они объявлены следующим образом:
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc>
operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT,_Traits,_Alloc>
operator+(const _CharT* __lhs,
const basic_string<_CharT,_Traits,_Alloc>& __rhs);
и так далее. Конструктор basic_string не объявлен явным. Как это не вызывает ту же ошибку, которую я получаю, и как я могу добиться того же поведения ??