Here is a repro case:
#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;
}
I’m using VS2011 (update 1).
When I try to use code that use the -> operator, I get this error:
error C2528: ‘->’ : pointer to reference is illegal
I understand the error, but what I don’t find is how to avoid it in this specific case.
I just need a pointer to the object inferred by the member reference. I tried several different syntaxes which all resulted in the same error.
Any idea how to write this operator correctly?
Note to keep the focus on the question: I’m voluntarly using a reference to avoid a copy that should never occur in the very specific and isolated context this helper code is used; the question isn’t about the design of the class.
LAST EDIT: replaced the question code with a full repro case. DeadMG is spot on so I accept his answer. To be more precise: the helper function (augmented()) forward MessageType as Test& instead of Test, which is wrong. There are several ways to fix this, the simplest being to make the helper function not forwarding the type but just take a const MesssageType&.
This code is quite legal for any particular value type. However, I suspect that you have instantiated it with a reference. This would lead to
const MessageType*expanding toconst (T&)*, which is not legal. You need to check that the template parameter is not a reference.