基本クラスFirst
と派生クラスがありSecond
ます。基本クラスには、メンバー関数create
と仮想関数がありますrun
。Second
I want to call the functionのコンストラクターでFirst::create
、その子クラスのrun()
関数の実装にアクセスする必要があります。First
同僚は、子クラスであることを明示的に知ることができないため、関数テンプレートの使用を推奨しました。奇妙に聞こえますか?ここにいくつかのコードがあります:
ファースト.h
#pragma once
#include <boost/thread/thread.hpp>
#include <boost/chrono/chrono.hpp>
class First
{
public:
First();
~First();
virtual void run() = 0;
boost::thread* m_Thread;
void create();
template< class ChildClass >
void create()
{
First::m_Thread = new boost::thread(
boost::bind( &ChildClass::run , this ) );
}
};
First.cpp
#include "First.h"
First::First() {}
First::~First() {}
Second.h
#pragma once
#include "first.h"
class Second : public First
{
public:
Second();
~Second();
void run();
};
Second.cpp
#include "Second.h"
Second::Second()
{
First::create<Second>();
}
void Second::run()
{
doSomething();
}
Error: type name is not allowedFirst::create<Second>();
というエラーが表示されます。では、このエラーの理由は何ですか? テンプレートの仕組み全体をまだ完全には理解していないと思いますが、このトピックは初めてです。