【问题标题】:C++ compilation error, ambigous operator overloadsC++ 编译错误,不明确的运算符重载
【发布时间】:2015-06-19 14:11:44
【问题描述】:

我有一个模板数组类重载operator [] 以访问项目和operator T * 以获取直接缓冲区访问。

template< typename T > class buffer
{
    const T & operator [] ( size_t ) const;
          T & operator [] ( size_t );

    operator const T * () const;
    operator       T * ();
};

由于某种原因,在此类的实例上使用 operator [] 会生成一个编译错误,指出有 4 种可能的重载。

buffer< int > buf;
buf[ some_position ] = 0; // Generates an error

错误:

Error   3   error C2666: 'XXX::buffer<T>::operator []' : 4 overloads have similar conversions   c:\XXX.cpp  3886

operator [] 是否试图将我的实例 buf 转换为 T * ?为什么检测到 4 个重载而不是 2 个?谢谢你。 :)

编辑: 其实是:buf[ some_position ] = 0; // Generates an error

【问题讨论】:

  • 你能发布确切的错误信息吗?
  • @Petr 我已经添加了。
  • 请发布完整错误消息,包括它列出的所有重载以及编译器生成的任何其他相关说明。
  • 这是完整的错误信息。我正在使用 Visual Studio 2005。
  • 它解释了here 为什么你会得到你的错误。查看底部的编译信息部分。

标签: c++ class operator-overloading ambiguous


【解决方案1】:

问题是你有两个方向的隐式转换。

不管const,你的两个候选人是:

T & buffer::operator [] ( size_t );
int& operator[] (int*, int);

对于buf[pos] 的调用,其中posint(例如文字),该调用是不明确的。第一个候选可以通过将pos 转换为std::size_t 来选择,第二个可以通过将buf 转换为int* 来选择。

您可以通过将参数显式转换为 std::size_t 或修改运算符以采用 int 来消除此调用的歧义。

【讨论】:

  • 谢谢,我不知道int&amp; operator[] (int*, int); 我猜这是一个非成员操作员使用它的operator T * 投射对象?
  • 这只是将整数指针索引为数组的内置操作。编译器会检查,因为您将隐式转换运算符转换为 T*
  • 我认为我应该避免耦合这两个重载并使用命名方法来访问缓冲区,不是吗?像 std::vector
  • 如果它适合您的用例,那肯定是一个不错的选择。
【解决方案2】:

您遇到的问题是operator T*operator[] 都将允许buf[some_position] 有效。在您的代码中,T*int*int* 具有 [] 过载。

你可以通过live example看到这一点

我认为这可能是您 VS 的问题,因为在 Coliruideone 上运行代码并进行一些修改以使其同时运行并提供工作代码。

【讨论】:

  • 顺便说一句,g++ 只列出了 2 个候选者,而 OP 的编译器(VS2005)说有四个。只是 OP 让 Visual Studio 过时了吗?
  • 是的,我要编写一个 VS 问题的代码。 Coliru 不介意。
  • 这只是问题的一部分,因为需要有不明确的隐式转换才能使调用不明确。
  • 感谢您的回答。我已经更新了我的问题,我忘记了分配,所以它不是关于 const / not-const,而是 TartanLlama 所说的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多