#include <stdio.h>
// B.h =================
class A;
/* 内部クラスは前方宣言できない
class A::Inner;
*/
class B
{
public:
void Func( A* p );
/* 前方宣言してない(できない)のでエラー
void Func( A::Inner* p ){}
*/
template<class T>
void Func( T* p );
};
// B.cpp =================
class A
{
public:
class Inner
{};
};
void B::Func( A* p ){ printf( "Func( A* p )\n" ); }
template<>
void B::Func<A::Inner>( A::Inner* p ){ printf( "Func<A::Inner>( A::Inner* p )\n" ); }
int main( void )
{
B b;
A a;
A::Inner inner;
b.Func( &a );
b.Func( &inner );
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgovLyBCLmggPT09PT09PT09PT09PT09PT0KCmNsYXNzIEE7Ci8qIOWGhemDqOOCr+ODqeOCueOBr+WJjeaWueWuo+iogOOBp+OBjeOBquOBhApjbGFzcyBBOjpJbm5lcjsKKi8KCmNsYXNzIEIKewpwdWJsaWM6Cgl2b2lkIEZ1bmMoIEEqIHAgKTsKCS8qIOWJjeaWueWuo+iogOOBl+OBpuOBquOBhCjjgafjgY3jgarjgYQp44Gu44Gn44Ko44Op44O8Cgl2b2lkIEZ1bmMoIEE6OklubmVyKiBwICl7fQoJKi8KCXRlbXBsYXRlPGNsYXNzIFQ+Cgl2b2lkIEZ1bmMoIFQqIHAgKTsKfTsKCi8vIEIuY3BwID09PT09PT09PT09PT09PT09CgpjbGFzcyBBCnsKcHVibGljOgoJY2xhc3MgSW5uZXIKCXt9Owp9OwoKdm9pZCBCOjpGdW5jKCBBKiBwICl7IHByaW50ZiggIkZ1bmMoIEEqIHAgKVxuIiApOyB9Cgp0ZW1wbGF0ZTw+CnZvaWQgQjo6RnVuYzxBOjpJbm5lcj4oIEE6OklubmVyKiBwICl7IHByaW50ZiggIkZ1bmM8QTo6SW5uZXI+KCBBOjpJbm5lciogcCApXG4iICk7IH0KCmludCBtYWluKCB2b2lkICkKewoJQiBiOwoJQSBhOwoJQTo6SW5uZXIgaW5uZXI7CgliLkZ1bmMoICZhICk7CgliLkZ1bmMoICZpbm5lciApOwogICAgcmV0dXJuIDA7Cn0=