这是一个责备案例:
#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)。 当我尝试使用使用 - &gt;的代码时运算符,我收到此错误:
错误C2528:' - &gt;' :引用指针是非法的
我理解错误,但我找不到的是如何在这种特定情况下避免它。 我只需要一个指向成员引用推断的对象的指针。我尝试了几种不同的语法,这些语法都导致了相同的错误。
知道如何正确编写此运算符吗?
注意保持对问题的关注:我自愿使用引用来避免在使用此帮助程序代码的特定且隔离的上下文中永远不会出现的副本;问题不在于班级的设计。
最后编辑:用完整的repro案例替换了问题代码。 DeadMG是现货,所以我接受他的回答。更确切地说:辅助函数(augmented())将MessageType转发为Test&
而不是Test
,这是错误的。有几种方法可以解决这个问题,最简单的方法是让辅助函数不转发类型,只需要const MesssageType&
。
答案 0 :(得分:3)
此代码对于任何特定值类型都是合法的。但是,我怀疑你已经用引用实例化了它。这会导致const MessageType*
扩展到const (T&)*
,这是不合法的。您需要检查模板参数是否不是参考。