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

Overridden << operator not recognized

本文关键字:lt 运算符 覆盖 识别      更新时间:2023-10-16

我正在尝试覆盖<<运算符,但看来编译器没有识别我的实现,而是试图将其解释为有点变化。我已经尝试使用参数类型( const T&T&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> *' 

如果我定义了在类上作用的相同操作员,则它只是有效的...

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

来自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;
}

正如其他人所说的那样,用户定义的类型的任何内置操作员都需要一个对象;指针行不通。解决方案是使用对象而不是指针:

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;
}