/* a.h */
#pragma once
template < typename A> class Foo;
template < typename A> A func( Foo< A> const & f) ;
template < typename A>
class Foo {
public :
Foo( A a) : _a( a) { }
private :
A _a;
friend A func< A> ( Foo const & f) ;
} ;
/* a.cpp */
#include "a.h"
template class Foo< int > ;
template int func< int > ( Foo< int > const & ) ;
template < typename A>
A func( Foo< A> const & f) {
return f._a;
}
/* main.cpp */
#include <iostream>
#include "a.h"
int main( ) {
Foo< int > f1( 10 ) , f2( 20 ) ;
int a = func( f1) ;
std:: cout << a << '\n ' << func( f2) << '\n ' ;
}
/* g++ a.cpp main.cpp */
LyogYS5oICovCiNwcmFnbWEgb25jZQoKdGVtcGxhdGU8dHlwZW5hbWUgQT4gY2xhc3MgRm9vOwp0ZW1wbGF0ZTx0eXBlbmFtZSBBPiBBIGZ1bmMoRm9vPEE+IGNvbnN0ICZmKTsKCnRlbXBsYXRlPHR5cGVuYW1lIEE+CmNsYXNzIEZvbyB7CnB1YmxpYzoKICAgIEZvbyhBIGEpIDogX2EoYSkge30KCnByaXZhdGU6CiAgICBBIF9hOyAKCiAgICBmcmllbmQgQSBmdW5jPEE+KEZvbyBjb25zdCAmZik7Cn07CgovKiBhLmNwcCAqLwojaW5jbHVkZSAiYS5oIgoKdGVtcGxhdGUgY2xhc3MgRm9vPGludD47CnRlbXBsYXRlIGludCBmdW5jPGludD4oRm9vPGludD4gY29uc3QmKTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBBPgpBIGZ1bmMoRm9vPEE+IGNvbnN0ICZmKSB7CiAgICByZXR1cm4gZi5fYTsKfQoKLyogbWFpbi5jcHAgKi8KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSAiYS5oIgoKaW50IG1haW4oKSB7CiAgICBGb288aW50PiBmMSgxMCksIGYyKDIwKTsKICAgIGludCBhID0gZnVuYyhmMSk7CiAgICBzdGQ6OmNvdXQgPDwgYSA8PCAnXG4nIDw8IGZ1bmMoZjIpIDw8ICdcbic7Cn0KCi8qIGcrKyBhLmNwcCBtYWluLmNwcCAqLw==