2013-08-29 2 views
0

У меня есть классы SuperClass и Subclass, где SubClass наследуется от SuperClass.C++ - недопустимое использование неопределенного типа ... - Объявление класса

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

ошибки. Что может быть проблемой?

+3

Пожалуйста, пожалуйста, пожалуйста, не вызывайте свой класс. – Borgleader

+1

@Borgleader (лучше называть его 'class class',' struct class', 'class struct' или' struct struct', right?: P) –

+0

@Borgleader Хорошо, я отредактировал вопрос, соответственно. – geraldCelente

ответ

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> 
{ 
}; 
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

Это неправильное решение. –