为什么我对以下功能的要求不明确?

时间:2011-09-18 00:00:13

标签: c++ ambiguous-call

请考虑以下事项:

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进行相同的调用,它运行正常。现在我不清楚为什么0std::string一起使用并且立即被识别为size_t,而在我的实现中它不是(另一种猜测是类型特征,但没有证据表明它在来源)?

2 个答案:

答案 0 :(得分:3)

啊,其中一次你喜欢“如果在c ++中,0与null不同,那会不会更好?”

无论如何,你的迭代器类型是对T *的类型定义,它是char *,而0是char *的精细值,因此模糊(呃,如K-ballo所写)。在std :: string中,迭代器类型不是char *,它会像另一个(模板化的)类一样花哨......

答案 1 :(得分:1)

由于0可以被视为指针和整数,因此会产生歧义。

如果您想区分它们,我的建议是将T *包裹在classtestClass。这就像是:

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的迭代器。