2

次のことを考慮してください。

template <typename T>
class testString
{
public:

  typedef T* iterator;

  void insert(iterator aPos, size_t numChars, T aChar);
  testString<T>& insert(size_t aIndex, size_t numChars, T aChar);
};

template <typename T>
void testString<T>::insert( iterator aPos, size_t numChars, T aChar )
{

}

template <typename T>
testString<T>& testString<T>::insert( size_t aIndex, size_t numChars, T aChar )
{
  return *this;
}

int main()
{
  testString<char> c;
  c.insert(0, 10, 'a'); // ambiguous call
  c.insert(1, 10, 'a'); // compiles fine

  return 0;
}

あいまいな電話を受けるのはなぜですか?最初は推測していましたが(0なので、何でもかまいません)、次に。を調べましたstd::string。ソースを調べたところ、次の2つの機能があります。

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

そして、std :: stringで同じ呼び出しを試しましたが、正常に機能します。今、私はなぜ0動作するのか分かりませんが、私の実装ではしばらくの間そうではないstd::stringとすぐに認識されますsize_t(別の推測はタイプ特性でしたが、ソースにはそれの証拠はありません)?

4

2 に答える 2

3

ああ、「c ++で、0がnullと同じではなかったらもっといいのではないか」というようなときの1つです。

とにかく、イテレータ型はT*にtypedefされます。これはchar*であり、0はchar *の適切な値であるため、あいまいさ(K-balloが書いたように)です。std :: stringでは、イテレータタイプはchar *ではなく、別の(テンプレート化された)クラスのような派手なものになります...

于 2011-09-18T00:11:55.640 に答える
1

0ポインタと整数の両方として扱うことができるため、あいまいさが生じます。

あなたがそれらを区別したいのであれば、私の提案はあなたT *class内側に包むことtestClassです。それは次のようなものです:

template <typename T>
class testString
{
public:
  class iterator
  {
  public:
    T *addr;
  }
  void insert(iterator aPos, size_t numChars, T aChar);
  testString<T>& insert(size_t aIndex, size_t numChars, T aChar);
};

お気づきの方もいらっしゃると思いますが、STLにも整数値をイテレータとして送信することはできませんが、タイプがのイテレータを渡す必要がありますwhateverclass<whatevertype>::iterator

于 2011-09-18T01:38:12.457 に答える