【问题标题】:Problems inheriting operator*继承运算符*的问题
【发布时间】:2014-03-24 19:29:09
【问题描述】:

我在尝试使用 VS2013 继承 C++ 中的运算符时遇到了一些麻烦。我有一个实现多个方法的类 A 和一个从 A 继承的类 B。类 A 还实现了一个运算符 *,它与另一个类 C 交互,例如:

class A
{
    ...
    C operator*(const C &_objectC) {...}
}

class B: public A
{
    ...
}

由于 A 和 B 之间的更改不会改变运算符 * 的实现,因此最好从 A 继承它而不是重新实现它。我一直在尝试这样做,但是编译器找不到A实现的运算符。

在以下代码中:

B foo = ...;
C bar = ...;
C result = foo * bar;

我遇到了这个错误:

error C2679: binary '*' : no operator found which takes a right-hand operand of type 'class C' (or there is no acceptable conversion)

我知道 operator= 必须被重载,因为编译器总是为每个类生成它的一个版本,所以你不能直接继承它。

¿可以继承其他运算符吗?我的理解是有可能,但我的编译器不同意。 ¿ 是不是我做错了什么,或者我只需要重新实现运算符才能调用父类的运算符?

提前致谢。

【问题讨论】:

  • 你用的是什么编译器?我可以在 VS 2013 中很好地编译它。(注意:我假设 operator* 是公开的,为了简洁起见,这部分被省略了。)
  • 你能发布一个不能编译的实际例子吗?这在 g++ 上运行良好。

标签: c++ visual-studio inheritance operators


【解决方案1】:

以下代码,相当于您提供的内容(在撰写此答案时),仅添加了分号并填写了 main 函数,有效:

class C {};

class A
{
public:
    auto operator*( C const &_objectC ) const
        -> C
    { return C(); }
};

class B: public A
{
};

auto main()
    -> int
{
    B foo = B();
    C bar = C();
    C result = foo * bar;
}

因此您没有提供问题所在的代码。

【讨论】:

    【解决方案2】:

    将运算符声明为非成员函数,编译器应该编译代码。例如

    C operator *( const A &, const C & );
    

    或者您可以将此运算符声明为虚拟并在派生类中重新定义它。

    也可能是运算符在A类中被声明为私有?

    【讨论】:

    • Re“难道操作符在A类中被声明为私有吗?”,如果它是私有的,那么编译器应该抱怨不可访问,而不是找不到。
    • @Cheers 和 hth。 - 阿尔夫我同意。但是像往常一样呈现的代码sn-p甚至没有编译。:)似乎很难编写一个简单的代码来重现问题。:)
    猜你喜欢
    • 2011-04-22
    • 2011-08-12
    • 2015-06-27
    • 2011-07-08
    • 2023-04-02
    • 2020-05-29
    • 1970-01-01
    • 2012-02-28
    • 2015-11-19
    相关资源
    最近更新 更多