Ошибка компилятора в VC ++ 2010 (чистый в 2008 году!), «Неоднозначный вызов перегруженной функции» - PullRequest
2 голосов
/ 25 августа 2010

Я сталкиваюсь с ошибкой компиляции в VS2010 с кодом, который аккуратно компилируется в VS2008.

Вот моя ошибка из окна вывода со всеми ее подробностями:

...\elementimpl.h(49): error C2668: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string' : ambiguous call to overloaded function
      with
      [
          _Elem=char,
          _Traits=std::char_traits<char>,
          _Ax=std::allocator<char>
      ]
      c:\program files (x86)\microsoft visual studio 10.0\vc\include\xstring(700): could be 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(std::basic_string<_Elem,_Traits,_Ax> &&)'
      with
      [
          _Elem=char,
          _Traits=std::char_traits<char>,
          _Ax=std::allocator<char>
      ]
      c:\program files (x86)\microsoft visual studio 10.0\vc\include\xstring(590): or       'std::basic_string<_Elem,_Traits,_Ax>::basic_string(const _Elem *)'
      with
      [
          _Elem=char,
          _Traits=std::char_traits<char>,
          _Ax=std::allocator<char>
      ]
      while trying to match the argument list '(CXStr)'

и вот код ошибки, elementimpl.h (49):

    std::string getAttributeValue(const char* attr) { return getAttribute(CXStr(attr)); }

getAttribute () возвращает CXStr (ADT), который, очевидно, не принимает конструктор std :: string, поэтому ему необходимо преобразовать CXStr во что-то подходящее.

CXStr может быть преобразован либо в std :: string, либо в char *:

class CXStr
{
public:
    ...
    CXStr(std::string);
    CXStr(const char* ch);

    const CXStr& operator=(const char*);
    const CXStr& operator=(std::string&);

    operator char*();
    operator std::string(); 
    ...
}

Когда я запускаю отладчик в VS2008 , я вижу, что он проходит через "CXStr :: operator std :: string ()" после getAttribute (), а затем проходит через std: : конструктор копирования строки для создания объекта, возвращаемого функцией getAttributeValue (). Я хочу, чтобы моя сборка 2010 года работала так же.

Мои вопросы:

  • Что VS2010 делает по-другому, и почему?
  • Какое изменение кода я могу сделать для исправить эту ошибку? Некоторые вещи, которые работают, но неудовлетворительно
    1. комментирование оператора CXStr :: char * () "; неудовлетворительно, потому что некоторые другой код использует это преобразование.
    2. явный вызов «GetAttribute (...). Оператор std :: string () "at elementimpl.h (49); непривлекательный, потому что эта же ошибка происходит в 27 разных местах, и это кажется, должно быть больше централизованный способ исправить это.

Ответы [ 2 ]

3 голосов
/ 25 августа 2010

Проблема в том, что VS2010 добавил конструкторы перемещения, и ваша реализация попадает прямо в эту дыру.

Ранее был только один конструктор, const char * one, который был доступен конструктору std :: string. Теперь есть и конструктор перемещения.

Я действительно считаю, что дизайн, основанный на неявных преобразованиях, опасен. Вот почему все конструкторы одного параметра должны быть явными ...

Я думаю, вам не следует использовать неявные операторы, поскольку они приводят к неправильным перегрузкам. Если вы не можете этого сделать, оберните текущие вызовы с ошибками в явный конверсионный вызов std::string( CXStr( x ).toString() ). Могут быть и другие ошибки, которые скрыты с помощью «неявных» операторов приведения ....

0 голосов
/ 25 августа 2010

Почему вы еще не попытались закомментировать оператор std :: string ()?

Вы также можете явно привести ваш CXStr к std :: string.

Честно говоря, я могуне вижу использования этой вещи CXStr.Что, если что-нибудь, это предоставляет в виде услуг?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...