#include <memory>
using namespace std;
class derived_op;
template < class Op>
class base_info :
enable_shared_from_this< base_info< Op>>
{
public :
void do_something_spawning_new_ops( )
{
auto info =
enable_shared_from_this< base_info< Op>> :: shared_from_this ( ) ;
}
} ;
class derived_info :
public base_info< derived_op>
{
} ;
template < class Info>
class base_op
{
public :
base_op( ) { }
base_op( shared_ptr< base_op> ) { }
shared_ptr< Info> m_info;
} ;
class derived_op :
public base_op< derived_info>
{
public :
derived_op( ) { }
derived_op( shared_ptr< base_op> ) { }
} ;
int main( )
{
derived_op d;
// Next line fails to compile.
base_op< base_info> b;
return 0 ;
}
I2luY2x1ZGUgPG1lbW9yeT4KCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCmNsYXNzIGRlcml2ZWRfb3A7CgoKdGVtcGxhdGU8Y2xhc3MgT3A+CmNsYXNzIGJhc2VfaW5mbyA6CiAgICBlbmFibGVfc2hhcmVkX2Zyb21fdGhpczxiYXNlX2luZm88T3A+Pgp7CnB1YmxpYzoKICAgIHZvaWQgZG9fc29tZXRoaW5nX3NwYXduaW5nX25ld19vcHMoKQogICAgewogICAgICAgIGF1dG8gaW5mbyA9IAogICAgICAgICAgICBlbmFibGVfc2hhcmVkX2Zyb21fdGhpczxiYXNlX2luZm88T3A+Pjo6c2hhcmVkX2Zyb21fdGhpcygpOwogICAgfQp9OwoKCmNsYXNzIGRlcml2ZWRfaW5mbyA6CiAgICBwdWJsaWMgYmFzZV9pbmZvPGRlcml2ZWRfb3A+CnsKCn07CgoKdGVtcGxhdGU8Y2xhc3MgSW5mbz4KY2xhc3MgYmFzZV9vcAp7CnB1YmxpYzoKICAgIGJhc2Vfb3AoKXt9CiAgICBiYXNlX29wKHNoYXJlZF9wdHI8YmFzZV9vcD4pe30KCiAgICBzaGFyZWRfcHRyPEluZm8+IG1faW5mbzsgCn07CgoKY2xhc3MgZGVyaXZlZF9vcCA6CiAgICBwdWJsaWMgYmFzZV9vcDxkZXJpdmVkX2luZm8+CnsKcHVibGljOgogICAgZGVyaXZlZF9vcCgpe30KICAgIGRlcml2ZWRfb3Aoc2hhcmVkX3B0cjxiYXNlX29wPil7fQp9OwoKCmludCBtYWluKCkKewogICAgZGVyaXZlZF9vcCBkOwogICAgLy8gTmV4dCBsaW5lIGZhaWxzIHRvIGNvbXBpbGUuCiAgICBiYXNlX29wPGJhc2VfaW5mbz4gYjsKCiAgICByZXR1cm4gMDsKfQoK
compilation info
prog.cpp: In function 'int main()':
prog.cpp:54:22: error: type/value mismatch at argument 1 in template parameter list for 'template<class Info> class base_op'
base_op<base_info> b;
^
prog.cpp:54:22: error: expected a type, got 'base_info'
prog.cpp:54:25: error: invalid type in declaration before ';' token
base_op<base_info> b;
^
stdout