0

我有类 SuperClass 和 Subclass,其中 SubClass 继承自 SuperClass。

在 SuperClass 中,我有一个常量属性,其值取决于使用它的子类。但是我需要在 SuperClass 中声明它,因为 SuperClass 中还有一些其他方法也在使用它,但是我需要在 SubClass 中初始化它,因为常量的值会根据实例化的 SubClass 类型而变化。

上一个关于 SO的问题中,我知道最好的解决方案是使用 trait 类。然而,使用这样的解决方案将涉及对我的代码进行大量更改。因此,我选择了此处显示的方法。

超类.h

#ifndef SUPERCLASS_H
#define SUPERCLASS_H


#include <string>

template <class T, class P>
class SuperClass
{
      public:

       typedef T type;
       typedef P position;

       static const position NULLPOSITION;

};

#endif

子类.h

#ifndef SUBCLASS_H
#define SUBCLASS_H

#include <string>
#include "SuperClass.h"


template <class T>
class SubClass:public SuperClass<T,int>
{

};

template<class T>
const typename SuperClass<T,int>::position SuperClass<T,int>::NULLPOSITION=0;

#endif

主文件

#include <cstdlib>
#include <iostream>
#include "SubClass.h"

using namespace std;

int main(int argc, char *argv[])
{
    SubClass<int> subClass;

    system("PAUSE");
    return EXIT_SUCCESS;
}

在编译我得到

invalid use of undefined type `class SuperClass<T, int>

declaration of `class SuperClass<T, int>

错误。可能是什么问题?

4

2 回答 2

2

问题是您对NULLPOSITION. NULLPOSITION您已为模板声明了一个静态成员SuperClass,但尚未定义它。相反,您尝试定义成员以对其进行部分显式实例化。您应该删除部分显式实例化定义,并为其定义一个常规模板类静态成员定义NULLPOSITION

为了允许子类为 提供不同的初始化值NULLPOSITION,这可以通过(可能是可选的)模板参数来完成。

template <class T, class P, P INIT>
class SuperClass
{
public:
    typedef T type;
    typedef P position;
    static const position NULLPOSITION;
};

template<class T, class P, P INIT>
const typename SuperClass<T,P,INIT>::position
    SuperClass<T,P,INIT>::NULLPOSITION = INIT;

template <class T>
class SubClass:public SuperClass<T,int, 0>
{
};
于 2013-08-29T18:27:10.293 回答
0

通过专业化你的方式,你实际上并没有实例化 NULLPOSITION (或 POSIZIONENULLA,检查你的代码)

14.7.1.2

特别是,静态数据成员的初始化(以及任何相关的副作用)不会发生,除非该静态数据成员本身的使用方式要求该静态数据成员的定义存在

您可能希望用另一个类显式定义数据成员,如

template<typename P>
class PositionClass
{
    public:
        typedef P position;
        static const position NULLPOSITION;
};
template <typename T, class P>
class SuperClass : public PositionClass<P>
{
    public:
        typedef T type;
};

const PositionClass<int>::position  PositionClass<int>::NULLPOSITION = 0;
于 2013-08-29T18:26:24.417 回答