C ++模板语法

时间:2009-06-15 12:32:05

标签: c++ templates

我不明白这段代码有什么问题。

gcc报告“Client.h:29:错误:'<'之前的预期模板名称标记“

据我所知,我正确地遵循了模板语法,但可能是错误信息让我困惑并且不是问题

client.h

class Client : public BaseDll<DllClient> [line 29]
{
..snip..
};

basedll.h

template<typename T>
class BaseDll : public Base
{
public:
    ..snip..

private:
  T* _dll;
};

6 个答案:

答案 0 :(得分:2)

class Base{
};
template<typename T>
class BaseDll:public Base{
public:
private:
T* _dll;
};
class DllClient{
};
class Clien:public BaseDll<DllClient>
{
};

这为我编译没有问题,所以我不认为问题在于你发布的内容。我最好的选择是你在client.h中犯了一个语法错误,也许就像在另一个类定义之后忘记分号或者一些搞乱代码的宏一样简单

答案 1 :(得分:2)

我很抱歉每个人都犯了一个男生错误,BaseDll在另一个名字空间中声明。一旦我添加了命名空间限定符,问题就消失了。

答案 2 :(得分:1)

也许这只是一个简单的问题:您是否在basedll.h中加入了client.h

答案 3 :(得分:1)

涵盖基础知识:

client-h #include basedll.h?他们是否使用不同的包含警卫?

进一步排查: 它是否适用于非模板基类? 它是否有效,然后你输入模板安装:

typedef BaseDll<DllClient> tClientBase;
class Client : public tClientBase { ... }

[编辑]好的,下一个:

如果您将以下两行直接放在BaseDll声明下:

template <typename T>
class BaseDll
{ ... 
};
class DummyFoo;
typedef BaseDll<DummyFoo> tDummyFoo;

答案 4 :(得分:0)

我认为你剪掉了这个问题。您是否包含了定义'DllClient'的内容?

答案 5 :(得分:0)

可能的原因是不同的头文件之间存在相互依赖性:

// client.h
#ifndef CLIENT
#define CLIENT

#include "base.h"

// ... 

class Client : public BaseDll<DllClient>
{
  // ..snip..
};

#endif


// base.h
#ifndef BASE
#define BASE

#include "client.h"

template<typename T>
class BaseDll : public Base
{
public:
  // ..snip..

private:
  T* _dll;
};

#endif

现在假设我们正在解析'base.cpp',那么预处理器将执行以下操作:

#include "base.h"
#ifndef BASE        <--- BASE unset, keep going
#define BASE
#include "client.h"
#ifndef CLIENT
#define CLIENT
#include "base.h" 
#ifndef BASE        <--- BASE set, skip base.h, return to client.h
class client
 : public BaseDll<DllClient>  <-- ERROR, BaseDll not defined.

如果这是问题,那么你可以通过在client.h中声明基本模板来解决它:

// client.h
#ifndef CLIENT
#define CLIENT

// #include "base.h"    <-- remove include
template <typename DLL_CLIENT>
class BaseDll;

// ... 

class Client : public BaseDll<DllClient>
{
  // ..snip..
};

#endif