Синтаксис шаблона C ++ - PullRequest
0 голосов
/ 15 июня 2009

Я не понимаю, что не так с этим кодом.

gcc сообщает "Client.h: 29: ошибка: ожидаемое имя шаблона до '<' токена" </p>

Насколько я знаю, я правильно придерживался синтаксиса шаблона, но может случиться так, что сообщение об ошибке сбивает меня с толку и не является проблемой

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 ]

2 голосов
/ 15 июня 2009

Мне очень жаль, школьник сделал ошибку, BaseDll объявлен в другом пространстве имен. Как только я добавил классификатор пространства имен, проблема исчезла.

2 голосов
/ 15 июня 2009
class Base{
};
template<typename T>
class BaseDll:public Base{
public:
private:
T* _dll;
};
class DllClient{
};
class Clien:public BaseDll<DllClient>
{
};

это скомпилировано для меня без проблем, поэтому я не думаю, что проблема заключается в том, что вы опубликовали. Лучше всего, если вы допустили синтаксическую ошибку в client.h, возможно, что-то простое: забыть точку с запятой после определения другого класса или какой-нибудь макрос, который мешает вашему коду

1 голос
/ 15 июня 2009

, чтобы охватить основы:

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;
1 голос
/ 15 июня 2009

Может быть, это просто простая проблема: вы включили basedll.h в client.h?

0 голосов
/ 15 июня 2009

Возможная причина этого заключается в том, что между различными заголовочными файлами существует взаимозависимость:

// 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
0 голосов
/ 15 июня 2009

Я думаю, что вы сняли проблему. Вы включаете что-то, чтобы определить 'DllClient'?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...