【问题标题】:std::string insert method has ambiguous overloads?std::string 插入方法有不明确的重载?
【发布时间】: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&lt;size_t&gt;(0), static_cast&lt;size_t&gt;(1), ch)
  • @ereOn:第二个static_cast 是不必要的,因为两个重载都将size_t 作为第二个参数。
  • 没有必要,因为未来可能出现重载和 '1' 的不确定整数类型。

标签: c++ stl stlport


【解决方案1】:

已知问题,裁定“不是缺陷”。 http://std.dkuug.dk/jtc1/sc22/wg21/docs/lwg-closed.html#84

【讨论】:

    【解决方案2】:

    如果您区分不同的整数类型,则完全没有歧义

    size_t(或ssize_t)类型存储缓冲区大小的良好实践命令,而不是int

    如果您同意这一点,那么调用 insert(int, int, char) 毫无意义,因为前两个参数应该是“缓冲区大小”。

    如果没有从intsize_t 的隐式转换,你甚至不能这样调用insert()

    【讨论】:

      【解决方案3】:

      有意或无意,这个问题更多地与0 的语义有关,而不是与所讨论的成员函数有关。也许微软库的设计者(我上次检查时他们使用了 Dinkumware)在这方面更加谨慎。

      【讨论】:

      • Dinkumware 可能不会有这个问题:使用真正的迭代器可以减轻歧义。
      猜你喜欢
      • 2012-03-02
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 2016-03-07
      • 1970-01-01
      • 2021-07-12
      相关资源
      最近更新 更多