/// \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 ;
}
Ly8vIFxicmllZiBUaGUgZnJlZS1mdW5jdGlvbiB0ZW1wbGF0ZSwKLy8vIHdoaWNoIGlzIG92ZXJsb2FkaW5nIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSBpbiBBYnN0cmFjdEEgYmVsb3cuCnRlbXBsYXRlIDxjbGFzcyBUPgppbmxpbmUgY29uc3QgVCBvdmVybG9hZGVkTWV0aG9kKGNvbnN0IFQmIGxocywgY29uc3QgVCYgcmhzKQp7CiAgICByZXR1cm4gVChsaHMudmFsdWUrcmhzLnZhbHVlKTsKfQoKLy8vIFxicmllZiBBYnN0cmFjdEEgY2xhc3MKY2xhc3MgQWJzdHJhY3RBCnsKcHVibGljOgogICAgQWJzdHJhY3RBIChpbnQgYVZhbCk6CiAgICAgIHZhbHVlKGFWYWwpCiAgICAgIHt9CgoKICAgICAgaW5saW5lIGNvbnN0IEFic3RyYWN0QSBvdmVybG9hZGVkTWV0aG9kKGNvbnN0IEFic3RyYWN0QSAmcmhzKSBjb25zdAogICAgICB7CiAgICAgICAgICByZXR1cm4gQWJzdHJhY3RBKHZhbHVlK3Jocy52YWx1ZSk7ICAgICAgICAgICAgCiAgICAgIH0KCnByb3RlY3RlZDoKICAgIGludCB2YWx1ZTsKfTsKCi8vLyBcYnJpZWYgQSBjbGFzcywgZGVyaXZpbmcgZnJvbSBBYnN0cmFjdEEsCi8vLyBhbmQgZnJpZW5kaW5nIHRoZSBmcmVlLWZ1bmN0aW9uIHRlbXBsYXRlLgpjbGFzcyBBIDogcHVibGljIEFic3RyYWN0QQp7ICAgCiAgICBmcmllbmQgY29uc3QgQSA6Om92ZXJsb2FkZWRNZXRob2QgPEE+KGNvbnN0IEEmIGxocywgY29uc3QgQSYgcmhzKTsKICAgICAgICAvLy8gVGhpcyBvbmUgZ2l2ZXMgbWUgY29tcGlsYXRpb24gZXJyb3IKICAgIC8vdGVtcGxhdGU8Y2xhc3MgVD4gZnJpZW5kIGNvbnN0IFQgb3ZlcmxvYWRlZE1ldGhvZChjb25zdCBUJiBsaHMsIGNvbnN0IFQmIHJocyk7CiAgICAgICAgLy8vIFRoaXMgb25lIHdvdWxkIGJlIG9rYXkKCnB1YmxpYzoKICAgIEEgKGludCBhVmFsKToKICAgICAgQWJzdHJhY3RBKGFWYWwpCiAgICAgIHt9Cn07CgppbnQgbWFpbigpCnsKICAgQSBhMSgxKSwgYTIoMik7CiAgIG92ZXJsb2FkZWRNZXRob2QoYTEsIGEyKTsKCiAgIHJldHVybiAwOwp9
compilation info
prog.cpp:31:18: error: ‘overloadedMethod’ in ‘class A’ does not name a type
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