【发布时间】:2021-08-24 15:58:43
【问题描述】:
是否可以覆盖模板类中的 -> 运算符并通过引用返回一些东西?
我看到了这个帖子:Overloading member access operators ->, .*
还有一个覆盖 -> 并通过引用返回的示例,但我无法让它与模板一起使用。这是我想要实现的一个小例子:
#include <iostream>
using namespace std;
class A
{
public:
void do_something()
{
cout << "Hey there";
}
};
template<class T>
class Ref
{
public:
Ref(T* ptr)
{
objPtr = ptr;
}
// this is another alternative, but I don't want to write Get() every time I want to access the object
T& get() { return *objPtr; }
template <class T>
Ref<T>& operator->() const { return *objPtr; }
// doesn't work either
//T& operator->() const { return *objPtr; }
// this works as expected, but I really MUST return by reference
//T* operator->() const { return objPtr; }
private:
T* objPtr;
};
int main()
{
A myObj;
Ref<A> ref(&myObj);
// error C2675: unary '->': 'Ref<A>' does not define this operator or a conversion to a type acceptable to the predefined operator
ref->do_something();
return 0;
}
如何做到这一点?
【问题讨论】:
-
为什么不返回一个指针?
const T* operator->() const { return objPtr; }和T* operator->() { return objPtr; } -
为什么要返回引用?您链接到的示例返回对还实现
operator->并返回指针的对象的引用。重点是你仍然有一个指针。
标签: c++ templates operator-overloading