2013-08-29 109 views
0

我有類SuperClass和Subclass,其中SubClass從SuperClass繼承。C++ - 無效使用未定義的類型... - 類的聲明

在SuperClass中我有一個常量屬性誰的值取決於使用它的子類。 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> 

錯誤。 可能是什麼問題?

+3

請請請請不要致電您的班級。 – Borgleader

+1

@Borgleader(更好地稱之爲'class class','struct class','class struct'或'struct struct',對吧?:P) – 2013-08-29 18:01:35

+0

@Borgleader好吧,我已經編輯了相應的問題。 – geraldCelente

回答

2

的問題是你的NULLPOSITION定義。您已爲模板SuperClass聲明一個靜態成員NULLPOSITION,但尚未定義它。相反,你試圖定義成員的部分顯式實例化它。您應該刪除部分顯式實例化定義,併爲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> 
{ 
}; 
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; 
+0

這不是正確的解決方案。 –