const — Нецелое объявление константы — dev-error: `тип ‘не был объявлен в этой области

У меня есть нецелое объявление константы в классе.

Я продолжаю получать следующее:

ComponentClass.h: 14: ошибка: объявление шаблона const typename ComponentClass<T> ::position NULLPOSITION
ComponentClass.h: 14: ошибка: позиция не была объявлена ​​в этой области
ComponentClass.h: 14: ошибка: ожидается ; перед числовой константой

Пожалуйста, найдите ниже мой код.

ComponentClass.h

#ifndef _ComponentClass_H
#define _ComponentClass_H

template< class T>
class ComponentClass
{
public:

typedef ComponentClass* position;
ComponentClass();
};

template<class T>
const typename ComponentClass<T>::position NULLPOSITION=(position)0;

template<class T>
ComponentClass<T>::ComponentClass(){}
#endif

0

Решение

Вы видите эту ошибку в том, что position не находится в области видимости в выражении (position)0, Вы можете полностью исключить приведение (т. Е. 0). Если вы хотите включить его, вам нужно будет использовать typename ComponentClass<T>::position как вы сделали в определении NULLPOSITION,

Похоже, вы определяете статическую переменную-член без предварительного объявления ее в классе следующим образом:

static const position NULLPOSITION;

Тогда вы можете определить это вне класса, как вы делаете сейчас. Однако во избежание избыточных определений типичное решение выглядит следующим образом:

// ComponentBase.h
class ComponentBase {
public:
typedef ComponentBase* position;
static const position NULLPOSITION;
};

// ComponentClass.h
template<class T>
class ComponentClass : public ComponentBase { ... };

// ComponentBase.cpp
const ComponentBase::position ComponentBase::NULLPOSITION = 0;

То есть не делать NULLPOSITION член каждого экземпляра ComponentClass, но вместо этого пусть все ComponentClass экземпляры имеют одно определение.

0

Другие решения

Похоже, вы пытаетесь определить своего рода «переменную шаблона», но в C ++ такой функции не существует.

Вы также не смогли получить второе место, на котором вы пишете position в той же строке кода.

Эти два фактора являются причиной ваших ошибок.


Это может делать немного смысл для NULLPOSITION быть статическим членом экземпляров шаблона класса:

template< class T>
class ComponentClass
{
public:

typedef ComponentClass* position;
static const position NULLPOSITION;

ComponentClass();
};

Но теперь, насколько я могу судить, вы должны определить это для каждого T вы хотите использовать, что довольно отстой:

template<>
const ComponentClass<int>::position ComponentClass<int>::NULLPOSITION =
static_cast<ComponentClass<int>::position>(0);

template<>
const ComponentClass<double>::position ComponentClass<double>::NULLPOSITION =
static_cast<ComponentClass<double>::position>(0);

Вместо этого возможно сделать position быть немного более умным, чем простой тип указателя — пусть это будет определенный пользователем тип с конструктором по умолчанию, который инициализирует объект в «нулевое» состояние. Функциональные объекты работают таким образом, например; std::function<void()>() является действительным, но единственное число функциональный объект.

3

По вопросам рекламы [email protected]