【发布时间】:2010-08-25 16:56:51
【问题描述】:
我在 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中运行调试器时,我可以看到它在getAttribute()之后通过“CXStr::operator std::string()”,然后通过std ::string 复制构造函数,用于创建要由 getAttributeValue() 返回的对象。我希望我的 2010 版本的行为方式相同。
我的问题:
- VS2010 有何不同,以及 为什么?
- 我可以对哪些代码进行更改
修复这个错误?有些事情
工作,但不满意:
- 注释掉“CXStr::operator char*()"; 不满意,因为有些 其他代码使用此转换。
- 显式调用 “getAttribute(...).operator std::string()" at elementimpl.h(49); 不吸引人,因为同样的错误 发生在27个不同的地方,它 似乎必须有更多 集中的方式来解决它。
【问题讨论】:
-
getAttribute的声明是什么? -
CXStr getAttribute(const XMLCh* pAttr);
标签: c++ visual-studio visual-studio-2008 visual-c++ visual-studio-2010