//classa.h
#ifndef CLASSA_H
#define CLASSA_H
template <class T>
class ClassA
{
public:
// class constructor
ClassA();
ClassA(int _a);
// class destructor
~ClassA();
protected:
int a;
};
#endif // CLASSA_H
//classa.cpp
#include "classa.h" // class's header file
// class constructor
template<class T>
ClassA<T>::ClassA()
{
// insert your code here
}
template<class T>
ClassA<T>::ClassA(int _a):a(_a)
{
// insert your code here
}
// class destructor
template<class T>
ClassA<T>::~ClassA()
{
// insert your code here
}
//classb.h
#ifndef CLASSB_H
#define CLASSB_H
#include "classa.h" // inheriting class's header file
/*
* No description
*/
template <class T>
class ClassB : public ClassA<T>
{
public:
// class constructor
ClassB();
// class destructor
~ClassB();
int geta();
};
#endif // CLASSB_H
//classb.cpp
#include "classb.h" // class's header file
// class constructor
template<class T>
ClassB<T>::ClassB()
{
// insert your code here
}
// class destructor
template<class T>
ClassB<T>::~ClassB()
{
// insert your code here
}
template<class T>
int ClassB<T>::geta()
{
return a;
}
Наследование шаблонов
Есть вот такой код с двумя шаблонами классов. ClassB наследует ClassA. Но при компиляции выдает, что классу В не известна пременная а. Если ClassA сделать не шаблоном то все нормально. Где у меня ошибка?
Код:
Держи объявление шаблонного класса и его реализацию в одном и том же юните, т.е. весь ClassA<T> в classa.h, весь ClassB<T> в classb.h.
Я попробовал сделать как Вы написали и первый раз компиляция прошла без проблем. Но как только я добавил #include "classb.h" в main.cpp ( здесь у меня находится ф-ция main()) опять выдает тоже сообщение, что не известна переменная а. Объект этого класса я даже не объявлял. Как только комментирую строчку включения заголовочного файла, компиляция опять без проблем. Может еще чего-то нужно добавить?
classa.h
Код:
//classa.h
#ifndef CLASSA_H
#define CLASSA_H
template <class T>
class ClassA
{
public:
// class constructor
ClassA();
ClassA(int _a);
// class destructor
~ClassA();
protected:
int a;
};
// class constructor
template<class T>
ClassA<T>::ClassA()
{
// insert your code here
}
template<class T>
ClassA<T>::ClassA(int _a):a(_a)
{
// insert your code here
}
// class destructor
template<class T>
ClassA<T>::~ClassA()
{
// insert your code here
}
#endif // CLASSA_H
#ifndef CLASSA_H
#define CLASSA_H
template <class T>
class ClassA
{
public:
// class constructor
ClassA();
ClassA(int _a);
// class destructor
~ClassA();
protected:
int a;
};
// class constructor
template<class T>
ClassA<T>::ClassA()
{
// insert your code here
}
template<class T>
ClassA<T>::ClassA(int _a):a(_a)
{
// insert your code here
}
// class destructor
template<class T>
ClassA<T>::~ClassA()
{
// insert your code here
}
#endif // CLASSA_H
classb.h
Код:
//classb.h
#ifndef CLASSB_H
#define CLASSB_H
#include "classa.h" // inheriting class's header file
/*
* No description
*/
template <class T>
class ClassB : public ClassA<T>
{
public:
// class constructor
ClassB();
ClassB(int a);
// class destructor
~ClassB();
int geta();
};
// class constructor
template<class T>
ClassB<T>::ClassB()
{
// insert your code here
}
template<class T>
ClassB<T>::ClassB(int a) : ClassA<T>(a)
{
// insert your code here
}
// class destructor
template<class T>
ClassB<T>::~ClassB()
{
// insert your code here
}
template<class T>
int ClassB<T>::geta()
{
return a;
}
#endif // CLASSB_H
#ifndef CLASSB_H
#define CLASSB_H
#include "classa.h" // inheriting class's header file
/*
* No description
*/
template <class T>
class ClassB : public ClassA<T>
{
public:
// class constructor
ClassB();
ClassB(int a);
// class destructor
~ClassB();
int geta();
};
// class constructor
template<class T>
ClassB<T>::ClassB()
{
// insert your code here
}
template<class T>
ClassB<T>::ClassB(int a) : ClassA<T>(a)
{
// insert your code here
}
// class destructor
template<class T>
ClassB<T>::~ClassB()
{
// insert your code here
}
template<class T>
int ClassB<T>::geta()
{
return a;
}
#endif // CLASSB_H
main.cpp
Код:
#include <iostream>
#include "classb.h"
int main()
{
ClassB<char> b(0xDEADBEEF);
std::cout << std::hex << b.geta();
return 0;
}
#include "classb.h"
int main()
{
ClassB<char> b(0xDEADBEEF);
std::cout << std::hex << b.geta();
return 0;
}
Вот это сами сообщения компилятора
Код:
3 F:\Dev-Cpp\Templates\1\main.cpp In file included from main.cpp
F:\Dev-Cpp\Templates\1\classb.h In member function `int ClassB<T>::geta()':
47 F:\Dev-Cpp\Templates\1\classb.h `a' undeclared (first use this function)
(Each undeclared identifier is reported only once for each function it appears in.)
F:\Dev-Cpp\Templates\1\Makefile.win [Build Error] [main.o] Error 1
F:\Dev-Cpp\Templates\1\classb.h In member function `int ClassB<T>::geta()':
47 F:\Dev-Cpp\Templates\1\classb.h `a' undeclared (first use this function)
(Each undeclared identifier is reported only once for each function it appears in.)
F:\Dev-Cpp\Templates\1\Makefile.win [Build Error] [main.o] Error 1
Откопал DevCpp. У него проблем с этим кодом нет.
Код:
//main.cpp
#include <cstdlib>
#include <iostream>
#include "classb.h"
using namespace std;
int main(int argc, char *argv[])
{
ClassB<char> b(0xDEADBEEF);
std::cout << std::hex << b.geta();
system("PAUSE");
return EXIT_SUCCESS;
}
#include <cstdlib>
#include <iostream>
#include "classb.h"
using namespace std;
int main(int argc, char *argv[])
{
ClassB<char> b(0xDEADBEEF);
std::cout << std::hex << b.geta();
system("PAUSE");
return EXIT_SUCCESS;
}
Код:
//classa.h
#ifndef CLASSA_H
#define CLASSA_H
template <class T>
class ClassA
{
public:
// class constructor
ClassA();
ClassA(T _a);
// class destructor
~ClassA();
protected:
T a;
};
// class constructor
template<class T>
ClassA<T>::ClassA()
{
// insert your code here
}
template<class T>
ClassA<T>::ClassA(T _a):a(_a)
{
// insert your code here
}
// class destructor
template<class T>
ClassA<T>::~ClassA()
{
// insert your code here
}
#endif // CLASSA_H
#ifndef CLASSA_H
#define CLASSA_H
template <class T>
class ClassA
{
public:
// class constructor
ClassA();
ClassA(T _a);
// class destructor
~ClassA();
protected:
T a;
};
// class constructor
template<class T>
ClassA<T>::ClassA()
{
// insert your code here
}
template<class T>
ClassA<T>::ClassA(T _a):a(_a)
{
// insert your code here
}
// class destructor
template<class T>
ClassA<T>::~ClassA()
{
// insert your code here
}
#endif // CLASSA_H
Код:
//classb.h
#ifndef CLASSB_H
#define CLASSB_H
#include "classa.h" // inheriting class's header file
/*
* No description
*/
template <class T>
class ClassB : public ClassA<T>
{
public:
// class constructor
ClassB();
ClassB(T b);
// class destructor
~ClassB();
T geta();
};
// class constructor
template<class T>
ClassB<T>::ClassB()
{
// insert your code here
}
template<class T>
ClassB<T>::ClassB(T b) : ClassA<T>(b)
{
// insert your code here
}
// class destructor
template<class T>
ClassB<T>::~ClassB()
{
// insert your code here
}
template<class T>
T ClassB<T>::geta()
{
return a;
}
#endif // CLASSB_H
#ifndef CLASSB_H
#define CLASSB_H
#include "classa.h" // inheriting class's header file
/*
* No description
*/
template <class T>
class ClassB : public ClassA<T>
{
public:
// class constructor
ClassB();
ClassB(T b);
// class destructor
~ClassB();
T geta();
};
// class constructor
template<class T>
ClassB<T>::ClassB()
{
// insert your code here
}
template<class T>
ClassB<T>::ClassB(T b) : ClassA<T>(b)
{
// insert your code here
}
// class destructor
template<class T>
ClassB<T>::~ClassB()
{
// insert your code here
}
template<class T>
T ClassB<T>::geta()
{
return a;
}
#endif // CLASSB_H
Полазил по Google Groups и наткнулся на вот это http://groups.google.ru/group/comp.lang.c++/browse_thread/thread/bb64c1f6334959f9/3bb65b512f6e5c89?lnk=gst.
Там рассмотрен аналогичный твоему вопрос и дана ссылка на материал, где объясняется это странное явление.
Ура! Все получилось:) . ОГРОМНОЕ СПАСИБО.:)