C ++ - 无效使用未定义类型... - 类的声明

时间:2013-08-29 17:58:48

标签: c++ class inheritance declaration

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

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

previous question on SO开始,我知道最好的解决方法是使用特质类。但是,使用这样的解决方案将涉及对我的代码的大量更改。因此,我选择了这里显示的方法。

SuperClass.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

SubClass.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

的main.cpp

#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>

错误。 可能是什么问题?

2 个答案:

答案 0 :(得分: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>
{
};

答案 1 :(得分: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;