【发布时间】:2013-08-22 09:58:14
【问题描述】:
我有一个基类First 和一个派生类Second。在基类中有一个成员函数create 和一个虚函数run。在Second的构造函数中,我想调用函数First::create,它需要访问其子类'run()函数的实现。一位同事建议使用函数模板,因为First 无法明确知道它是子类。听起来怪怪的?这是一些代码:
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();
}
我在First::create<Second>(); 收到一个错误,说错误:不允许类型名称。那么这个错误的原因是什么?我想我还没有完全了解模板的全部机制 - 我对这个主题很陌生。
【问题讨论】:
-
把函数模板的定义放在表头。见,例如this question
-
只需
template <class ChildClass>进入 First.h?不幸的是,对错误没有任何影响。 -
不,整个函数体。它需要在头文件中,因为函数模板实例化的定义需要在使用它们的每个 TU 中可用。
-
好的,我将整个模板...创建函数体放入 First.h,但它仍然在 Second.cpp 中的
First::create<Second>();处显示该错误 -
请同时显示标题。 SSCCE 将不胜感激。