0

我在一个类中有一个非整数常量声明。

我不断收到以下信息:

ComponentClass.h:14:错误:ComponentClass.h:14 的模板声明const typename ComponentClass<T> ::position NULLPOSITION
:错误:在此范围内未声明位置
ComponentClass.h:14:错误:预期;在数字常量之前

请在下面找到我的代码。

组件类.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
4

2 回答 2

3

您似乎正在尝试定义一种“模板变量”,但 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);

Instead perhaps make position be a bit more clever than a mere pointer type — let it be a proper user-defined type with a default constructor that initialises the object to a "null" state. Function objects work in this way, for example; std::function<void()>() is a valid, but singular function object.

于 2012-12-05T18:55:04.510 回答
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实例化共享一个定义。

于 2012-12-05T18:52:54.303 回答