重写 << 运算符无法识别
Overridden << operator not recognized
我试图覆盖 <<
运算符,但编译器似乎无法识别我的实现,而是试图将其解释为位移。
我已经尝试使用参数类型(const T&
、T&
、T
、const 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;
}
我试图覆盖 <<
运算符,但编译器似乎无法识别我的实现,而是试图将其解释为位移。
我已经尝试使用参数类型(const T&
、T&
、T
、const 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;
}