c++ - 为什么我对以下函数的调用不明确?

标签 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 而在我的实现中它不是(另一个猜测是类型特征,但来源中没有证据)?

最佳答案

啊,有一次你会想“如果在 C++ 中,0 与 null 不同不是更好吗?”

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

关于c++ - 为什么我对以下函数的调用不明确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7458645/

相关文章:

c++ - 一个 lambda 的返回类型可以通过返回值来推断,那么为什么不能是一个函数呢?

c++ - 在 C++ 中,这段代码是什么意思?

C#编译器提示函数本身不明确

c# - 为什么我在 vb 中得到不明确的调用,而在 c# 中却没有?

c++ - 文字 `0` 是 int 和 const string& 重载的有效候选者会导致模棱两可的调用

c++ - 使用 FFMPEG API 读取特定视频帧

c++ - std::default_random_engine 生成介于 0.0 和 1.0 之间的值

C++/阿杜伊诺 : dynamic int array

c++ - static_cast 没有按预期处理优先级

C++ 继承错误 : ambiguous error