我有类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>
错误。 可能是什么问题?
答案 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;