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