/// \brief The free-function template,
/// which is overloading a method with the same name in AbstractA below.
template < class T>
inline const T overloadedMethod( const T& lhs, const T& rhs)
{
return T( lhs.value + rhs.value ) ;
}
/// \brief AbstractA class
class AbstractA
{
public :
AbstractA ( int aVal) :
value( aVal)
{ }
inline const AbstractA overloadedMethod( const AbstractA & rhs) const
{
return AbstractA( value+ rhs.value ) ;
}
protected :
int value;
} ;
/// \brief A class, deriving from AbstractA,
/// and friending the free-function template.
class A : public AbstractA
{
friend const A overloadedMethod < A> ( const A& lhs, const A& rhs) ;
/// This one gives me compilation error
//template<class T> friend const T overloadedMethod(const T& lhs, const T& rhs);
/// This one would be okay
public :
A ( int aVal) :
AbstractA( aVal)
{ }
} ;
int main( )
{
A a1( 1 ) , a2( 2 ) ;
overloadedMethod( a1, a2) ;
return 0 ;
}
Ly8vIFxicmllZiBUaGUgZnJlZS1mdW5jdGlvbiB0ZW1wbGF0ZSwKLy8vIHdoaWNoIGlzIG92ZXJsb2FkaW5nIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSBpbiBBYnN0cmFjdEEgYmVsb3cuCnRlbXBsYXRlIDxjbGFzcyBUPgppbmxpbmUgY29uc3QgVCBvdmVybG9hZGVkTWV0aG9kKGNvbnN0IFQmIGxocywgY29uc3QgVCYgcmhzKQp7CiAgICByZXR1cm4gVChsaHMudmFsdWUrcmhzLnZhbHVlKTsKfQoKLy8vIFxicmllZiBBYnN0cmFjdEEgY2xhc3MKY2xhc3MgQWJzdHJhY3RBCnsKcHVibGljOgogICAgQWJzdHJhY3RBIChpbnQgYVZhbCk6CiAgICAgIHZhbHVlKGFWYWwpCiAgICAgIHt9CgoKICAgICAgaW5saW5lIGNvbnN0IEFic3RyYWN0QSBvdmVybG9hZGVkTWV0aG9kKGNvbnN0IEFic3RyYWN0QSAmcmhzKSBjb25zdAogICAgICB7CiAgICAgICAgICByZXR1cm4gQWJzdHJhY3RBKHZhbHVlK3Jocy52YWx1ZSk7ICAgICAgICAgICAgCiAgICAgIH0KCnByb3RlY3RlZDoKICAgIGludCB2YWx1ZTsKfTsKCi8vLyBcYnJpZWYgQSBjbGFzcywgZGVyaXZpbmcgZnJvbSBBYnN0cmFjdEEsCi8vLyBhbmQgZnJpZW5kaW5nIHRoZSBmcmVlLWZ1bmN0aW9uIHRlbXBsYXRlLgpjbGFzcyBBIDogcHVibGljIEFic3RyYWN0QQp7ICAgCiAgICBmcmllbmQgY29uc3QgQSBvdmVybG9hZGVkTWV0aG9kIDxBPihjb25zdCBBJiBsaHMsIGNvbnN0IEEmIHJocyk7CiAgICAgICAgLy8vIFRoaXMgb25lIGdpdmVzIG1lIGNvbXBpbGF0aW9uIGVycm9yCiAgICAvL3RlbXBsYXRlPGNsYXNzIFQ+IGZyaWVuZCBjb25zdCBUIG92ZXJsb2FkZWRNZXRob2QoY29uc3QgVCYgbGhzLCBjb25zdCBUJiByaHMpOwogICAgICAgIC8vLyBUaGlzIG9uZSB3b3VsZCBiZSBva2F5CgpwdWJsaWM6CiAgICBBIChpbnQgYVZhbCk6CiAgICAgIEFic3RyYWN0QShhVmFsKQogICAgICB7fQp9OwoKaW50IG1haW4oKQp7CiAgIEEgYTEoMSksIGEyKDIpOwogICBvdmVybG9hZGVkTWV0aG9kKGExLCBhMik7CgogICByZXR1cm4gMDsKfQ==
compilation info
prog.cpp:31:20: error: field ‘overloadedMethod’ has incomplete type
friend const A overloadedMethod <A>(const A& lhs, const A& rhs);
^
prog.cpp:31:20: error: expected ‘;’ at end of member declaration
prog.cpp:31:37: error: expected unqualified-id before ‘<’ token
friend const A overloadedMethod <A>(const A& lhs, const A& rhs);
^
prog.cpp: In instantiation of ‘const T overloadedMethod(const T&, const T&) [with T = A]’:
prog.cpp:45:27: required from here
prog.cpp:24:9: error: ‘int AbstractA::value’ is protected
int value;
^
prog.cpp:6:23: error: within this context
return T(lhs.value+rhs.value);
^
prog.cpp:24:9: error: ‘int AbstractA::value’ is protected
int value;
^
prog.cpp:6:23: error: within this context
return T(lhs.value+rhs.value);
^
stdout