覆盖的 << 运算符无法识别

Posted

技术标签:

【中文标题】覆盖的 << 运算符无法识别【英文标题】:Overridden << operator not recognized 【发布时间】:2016-12-11 18:19:55 【问题描述】:

我正在尝试覆盖 &lt;&lt; 运算符,但编译器似乎无法识别我的实现,而是尝试将其解释为位移。 我已经尝试过使用参数类型(const T&amp;T&amp;Tconst T)无济于事。

#pragma once

template<typename T> class AbstractStack

    public:
        virtual bool Push(const T &) = 0;


template <typename T> class ArrayStack : public AbstractStack <T>

    public:
        bool Push(const T&) 
            ....
        


template <typename T> bool operator<<(const AbstractStack<T>* &, const T&) 
    return stack->Push(item);



int main() 
    AbstractStack<int> *stack = new ArrayStack<int>(5);
    int a = 2;
    stack << a; // <<-- compiler error
    return 0;

报错是:

Error (active)      expression must have integral or unscoped enum type Lab10   
Error   C2296   '<<': illegal, left operand has type 'AbstractStack<int> *' 

如果我将作用于类的相同运算符定义为值,它就可以工作...

【问题讨论】:

您只能重载具有至少一个类类型对象的运算符。对于一个参数,您有一个指针,而另一个参数是一个整数。 声明算子为ArrayStack的成员函数 看看这个:***.com/questions/6171630/… 【参考方案1】:

重载运算符时,至少有一个参数必须是类或枚举类型 - 基本上这允许/限制您重载自定义类型(用户定义的类型)。

来自cppreference;

当一个运算符出现在表达式中,并且其操作数中至少有一个是类类型或枚举类型时,则使用重载决策在所有签名匹配的函数中确定要调用的用户定义函数关注...

这是有道理的,因为它不允许您重载内置类型; 在这种情况下,作为参数的指针和整数

正如您在问题中已经说过的那样,解决方案是通过引用来获取您的第一个论点;

template <typename T>
bool operator<<(AbstractStack<T> &, const T&)
 //...

鉴于您要使用的抽象基类,您可以研究使用 std::shared_ptr 来帮助管理资源并在重载运算符中使用“指针”(尽管它将是一个智能指针);

template <typename T>
bool operator<<(std::shared_ptr<AbstractStack<T>>&, const T&)

  return stack->Push(item);


int main() 
  std::shared_ptr<AbstractStack<int>> stack = std::make_shared<ArrayStack<int>>(5);
  int a = 2;
  stack << a;
  return 0;

【讨论】:

【参考方案2】:

正如其他人所说,重载任何内置运算符都需要用户定义类型的对象;指针不起作用。解决方法是使用对象而不是指针:

template <typename T> bool operator<<(AbstractStack<T>&, const T&) 
    return stack.Push(item);

然后用一个对象调用它。您显示的代码中没有充分的理由从免费商店分配;只需创建一个自动对象:

int main() 
    ArrayStack<int> stack(5);
    int a = 2;
    stack << a;
    return 0;

【讨论】:

以上是关于覆盖的 << 运算符无法识别的主要内容,如果未能解决你的问题,请参考以下文章

为啥WPF无法识别我的这个DynamicResource

在kustomize覆盖之间共享补丁-无法识别变压器

为啥以前的输入键无法识别?

无法识别扩展运算符的重载方法

<script> 的内部元素无法被文档识别

Bash 无法识别文件测试运算符