只有引用时如何正确编写->运算符?
How to write -> operator correctly when you only have a reference?
这里有一个repro案例:
#include <iostream>
template< class MessageType >
class Augmented
{
public:
Augmented( const MessageType& message )
: m_message( message )
{}
const MessageType* operator->() const { return &m_message; }
private:
const MessageType& m_message;
};
template< class MessageType >
Augmented<MessageType> augmented( MessageType&& message )
{
return Augmented<MessageType>( std::forward<MessageType>(message) );
}
class Test
{
public:
void print() const { std::cout << "Hello World" << std::endl; }
};
int main()
{
Test test;
auto augmented_test = augmented( test );
augmented_test->print();
return 0;
}
我正在使用VS2011(更新1)。当我尝试使用使用->运算符的代码时,我会得到以下错误:
错误C2528:'->':指向引用的指针是非法的
我理解这个错误,但我不知道如何在这种特定情况下避免它。我只需要一个指向由成员引用推断出的对象的指针。我尝试了几种不同的语法,但都导致了相同的错误。
知道如何正确编写这个运算符吗?
注意,要把重点放在这个问题上:我自愿使用引用,以避免在使用这个辅助代码的非常特定和孤立的上下文中出现永远不应该出现的副本;问题不在于课程的设计。
最后一次编辑:用完整的重新编写案例替换问题代码。DeadMG很准确,所以我接受他的回答。更准确地说:helper函数(augmented())将MessageType转发为Test&
而不是Test
,这是错误的。有几种方法可以解决这个问题,最简单的方法是使helper函数不转发类型,而只接受const MesssageType&
。
此代码对于任何特定的值类型都是合法的。但是,我怀疑您已经用引用实例化了它。这将导致const MessageType*
扩展到const (T&)*
,这是不合法的。您需要检查模板参数是否不是引用。
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 是否需要使用 - &gt;运算符在C 中调用成员函数时