これが再現ケースです:
#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&
.