0

クラスに非整数定数宣言があります。

私は次のことを続けています:

ComponentClass.h:14: エラー: ComponentClass.h:14 のテンプレート宣言const typename ComponentClass<T> ::position NULLPOSITION
: エラー: このスコープで位置が宣言されていません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
4

2 に答える 2

3

一種の「テンプレート変数」を定義しようとしているようですが、C++ にはそのような機能はありません。

positionまた、同じコード行で記述した 2 番目の場所を修飾できませんでした。

これらの 2 つの要因がエラーの原因です。


がクラス テンプレートのインスタンスの静的メンバーであることある程度理にかなっている場合があります。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単なるポインター型よりも少し賢いものにします。オブジェクトを「null」状態に初期化するデフォルトのコンストラクターを持つ適切なユーザー定義型にします。関数オブジェクトは、たとえば次のように機能します。std::function<void()>()は有効ですが、特異な関数オブジェクトです。

于 2012-12-05T18:55:04.510 に答える
0

The reason you’re seeing this error is that position is not in scope in the expression (position)0. You can omit the cast altogether (i.e, 0). If you wanted to include it, you would need to use typename ComponentClass<T>::position as you did in the definition of NULLPOSITION.

You appear to be defining a static member variable without first declaring it in the class like so:

static const position NULLPOSITION;

Then you can define it outside the class as you do now. In order to avoid redundant definitions, however, the typical solution is as follows:

// 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;

That is, don’t make NULLPOSITION a member of every instantiation of ComponentClass, but instead let all ComponentClass instantiations share a single definition.

于 2012-12-05T18:52:54.303 に答える