下面的code没有问题,但如果在main里面换成TServer<secondImpl> server会出现编译错误,能找出来么?
#include <iostream>
template <typename TSession> class TServer;
template <typename TImpl>
class TSession
{
TServer<TImpl> *m_server;
public:
void Init(TServer<TImpl> *server)
{
m_server = server;
}
virtual int Run()
{
std::cout<<"TSession::Run"<<std::endl;
return 0;
}
};
template <typename TSession>
class TServer
{
TSession *m_session;
public:
void Run()
{
m_session = new TSession;
m_session->Init(this);
}
};
class TFirstImpl: public TSession<TFirstImpl>
{
public:
virtual int Run()
{
std::cout<<"TFirstImpl::Run"<<std::endl;
return 0;
}
};
class TSecondImpl: public TFirstImpl
{
public:
virtual int Run()
{
std::cout<<"SecondImpl::Run"<<std::endl;
return 0;
}
};
int main(int argc, char *argv[])
{
TServer<TFirstImpl> server;
server.Run();
return 0;
}
问题在于secondImpl 实际上也是一个TSession<firstImpl>
#include <iostream>
template <typename TSession> class TServer;
template <typename TImpl>
class TSession
{
TServer<TImpl> *m_server;
public:
void Init(TServer<TImpl> *server)
{
m_server = server;
}
virtual int Run()
{
std::cout<<"TSession::Run"<<std::endl;
return 0;
}
};
template <typename TSession>
class TServer
{
TSession *m_session;
public:
void Run()
{
m_session = new TSession;
m_session->Init(this);
}
};
class TFirstImpl: public TSession<TFirstImpl>
{
public:
virtual int Run()
{
std::cout<<"TFirstImpl::Run"<<std::endl;
return 0;
}
};
class TSecondImpl: public TFirstImpl
{
public:
virtual int Run()
{
std::cout<<"SecondImpl::Run"<<std::endl;
return 0;
}
};
int main(int argc, char *argv[])
{
TServer<TFirstImpl> server;
server.Run();
return 0;
}
问题在于secondImpl 实际上也是一个TSession<firstImpl>