1

基本クラスFirstと派生クラスがありSecondます。基本クラスには、メンバー関数createと仮想関数がありますrunSecondI 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>();というエラーが表示されます。では、このエラーの理由は何ですか? テンプレートの仕組み全体をまだ完全には理解していないと思いますが、このトピックは初めてです。

4

2 に答える 2