5

環境: STLPort 5.1.4 を使用する VS2005 C++。

次のコード スニペットをコンパイルします。

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   

問題は、文字列オブジェクトに対する挿入メソッドの呼び出しにあるようです。

定義された 2 つのオーバーロードは次のとおりです。

void insert ( iterator p, size_t n, char c );
string& insert ( size_t pos1, size_t n, char c );

しかし、STLPort が単純な char* を反復子として使用することを考えると、私のコードの挿入メソッドのリテラル 0 はあいまいです。

したがって、次のようなヒントを与えることで問題を簡単に克服できますが、

copied.insert(size_t(0),1,ch);

私の質問は次のとおりです。この過負荷と可能性のあるあいまいさは、仕様で意図的に行われていますか? それとも、特定の STLPort 実装の意図しない副作用でしょうか?

(Microsoft が提供する STL には、ネイキッド ポインターの代わりに反復子のクラスがあるため、この問題がないことに注意してください)

4

3 に答える 3

1

既知の問題で、「欠陥ではありません」と判断されました。http://std.dkuug.dk/jtc1/sc22/wg21/docs/lwg-closed.html#84

于 2010-05-12T14:21:57.717 に答える
0

異なる整数型を区別すると、あいまいさはまったくありませ

バッファ サイズをではなくsize_t(またはssize_t) 型に格納するための推奨コマンドint

それに同意する場合、insert(int, int, char)最初の2つの引数は「バッファサイズ」であると想定されているため、呼び出しは意味がありません。

intからへの暗黙的な変換がなければ、そのようにsize_t呼び出すことさえできませんinsert()

于 2010-05-12T14:21:05.970 に答える
0

意図的であろうとなかろうと、問題は問題0のメンバー関数よりもセマンティクスに関係しています。おそらく、Microsoft ライブラリの設計者 (私が最後にチェックしたときは Dinkumware を使用していました) は、この点でより慎重でした。

于 2010-05-12T14:21:08.333 に答える