【发布时间】:2011-02-18 15:52:48
【问题描述】:
环境:VS2005 C++ 使用 STLPort 5.1.4。
编译如下代码sn-p:
std::string copied = "asdf";
char ch = 's';
copied.insert(0,1,ch);
我收到一个错误:
Error 1 error C2668: 'stlpx_std::basic_string<_CharT,_Traits,_Alloc>::insert' : ambiguous call to overloaded function
看来问题出在字符串对象的insert方法调用上。
两个定义的重载是
void insert ( iterator p, size_t n, char c );
string& insert ( size_t pos1, size_t n, char c );
但鉴于 STLPort 使用简单的 char* 作为其迭代器,我的代码中 insert 方法中的字面量零是不明确的。
所以虽然我可以通过 hinting 轻松克服这个问题,例如
copied.insert(size_t(0),1,ch);
我的问题是:规范中是否存在这种重载和可能的歧义?或者更可能是特定 STLPort 实现的意外副作用?
(请注意,Microsoft 提供的 STL 没有这个问题,因为它有一个用于迭代器的类,而不是一个裸指针)
【问题讨论】:
-
再严格一点:应该是
copied.insert(static_cast<size_t>(0), static_cast<size_t>(1), ch) -
@ereOn:第二个
static_cast是不必要的,因为两个重载都将size_t作为第二个参数。 -
没有必要,因为未来可能出现重载和 '1' 的不确定整数类型。