无法识别被覆盖<<运算符
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> *'
如果我定义了在类上作用的相同操作员,则它只是有效的...
超载运算符时,至少一个参数必须是类或枚举类型 - 基本上,这允许/限制您超载自定义类型(用户定义的类型)。
来自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;
}
相关文章:
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 如何显式调用运算符<<
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员&lt;&lt;这是一个iStream运算符
- C++运算符<<调用::ostream而不是std::osttream
- BOOST ::变体无法解决运算符&lt;&lt;对于STD :: Ostream
- 过载输出<<用于类的运算符,以打印其中的元组
- C++ostream:没有运算符匹配<<&应在'&'代币
- 重载运算符<<:此运算符函数的参数太多
- C++继承运算符<<
- 重载运算符<<用于模板类.即使使用好友关键字也无法获得私人会员
- 如何过载<<用于YAML::Emitter的运算符,以序列化包含另一个自定义类的向量的自定义类
- 为什么字符串流运算符<<擦除原始值
- 关于使用运算符<<为新手提供C++中的模板
- 我已经完成了<<运算符重载,但它'It’不起作用
- 重载运算符<<输出地址而不是数据成员
- 错误:没有匹配'运算符<<"在'std::cout
- 重载运算符<<用于ostream语法
- 当运算符<存在时,为什么要定义 LT?
- log4cxx访问异常,使用<<运算符和宏
- 重载<<运算符错误C2804:二进制'运算符<<'参数太多