重写 << 运算符无法识别

Overridden << operator not recognized

我试图覆盖 << 运算符,但编译器似乎无法识别我的实现,而是试图将其解释为位移。 我已经尝试使用参数类型(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> *' 

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

重载运算符时,至少有一个参数必须是 class 或枚举类型 - 基本上这 allows/limits 你要重载自定义类型(用户定义的类型)。

来自cppreference;

When an operator appears in an expression, and at least one of its operands has a class type or an enumeration type, then overload resolution is used to determine the user-defined function to be called among all the functions whose signatures match the following...

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

正如您在问题中所说的那样,解决方案是引用您的第一个参数;

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

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

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