У меня есть нецелое объявление константы в классе.
Я продолжаю получать следующее:
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
Вы видите эту ошибку в том, что 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
экземпляры имеют одно определение.
Похоже, вы пытаетесь определить своего рода «переменную шаблона», но в 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()>()
является действительным, но единственное число функциональный объект.