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&ではなく as として転送しますがTest、これは間違っています。これを修正するにはいくつかの方法があります。最も簡単な方法は、ヘルパー関数が型を転送せず、const MesssageType&.

4

1 に答える 1

3

このコードは、特定の値の型に対して非常に有効です。ただし、参照を使用してインスタンス化したと思われます。const MessageType*これは への拡張につながりますがconst (T&)*、これは合法ではありません。テンプレート パラメータが参照でないことを確認する必要があります。

于 2012-12-17T15:49:22.843 に答える