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. 我查看了源码,这是两个函数:

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 不一样不是更好吗?”

无论如何,您的迭代器类型是 T* 的类型定义,即 char*,而 0 是 char* 的一个很好的值,因此存在歧义(呃,正如 K-ballo 所写的那样)。在 std::string 中,迭代器类型不会是 char*,它会像另一个(模板化)类一样花哨......

于 2011-09-18T00:11:55.640 回答
1

由于0可以同时将其视为指针和整数,因此您会得到歧义。

如果您想区分它们,我的建议是将您的包装T *classinside 中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 回答