1

这是一个复制案例:

#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 是正确的,所以我接受他的回答。更准确地说:辅助函数 (augmented()) 将 MessageType 转发为Test&而不是Test,这是错误的。有几种方法可以解决这个问题,最简单的方法是让辅助函数不转发类型,而只是采用const MesssageType&.

4

1 回答 1

3

这段代码对于任何特定的值类型都是合法的。但是,我怀疑您已经使用引用对其进行了实例化。这将导致const MessageType*扩展到const (T&)*,这是不合法的。您需要检查模板参数是否不是引用。

于 2012-12-17T15:49:22.843 回答