Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Наследование шаблонов

26K
28 марта 2007 года
mad_man
5 / / 28.03.2007
Здравствуйте.

Есть вот такой код с двумя шаблонами классов. ClassB наследует ClassA. Но при компиляции выдает, что классу В не известна пременная а. Если ClassA сделать не шаблоном то все нормально. Где у меня ошибка?

Код:
//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;
}
1.8K
28 марта 2007 года
k3Eahn
365 / / 19.12.2005
Держи объявление шаблонного класса и его реализацию в одном и том же юните, т.е. весь ClassA<T> в classa.h, весь ClassB<T> в classb.h.
26K
28 марта 2007 года
mad_man
5 / / 28.03.2007
Спасибо.
Я попробовал сделать как Вы написали и первый раз компиляция прошла без проблем. Но как только я добавил #include "classb.h" в main.cpp ( здесь у меня находится ф-ция main()) опять выдает тоже сообщение, что не известна переменная а. Объект этого класса я даже не объявлял. Как только комментирую строчку включения заголовочного файла, компиляция опять без проблем. Может еще чего-то нужно добавить?
1.8K
28 марта 2007 года
k3Eahn
365 / / 19.12.2005
Вот так всё компилится и работает:
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


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

main.cpp
 
Код:
#include <iostream>
#include "classb.h"

int main()
{
    ClassB<char> b(0xDEADBEEF);

    std::cout << std::hex << b.geta();
    return 0;
}
26K
28 марта 2007 года
mad_man
5 / / 28.03.2007
Скопировал Ваш код и попробовал откомпилировать. Опять та же ошибка :( Может быть это из-за компилятора. Пользуюсь g++

Вот это сами сообщения компилятора

 
Код:
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
1.8K
28 марта 2007 года
k3Eahn
365 / / 19.12.2005
Хм, даже не знаю. Проблема скорее всего не в коде, а в компиляторе.
Откопал DevCpp. У него проблем с этим кодом нет.
26K
28 марта 2007 года
mad_man
5 / / 28.03.2007
Нет не помогает. Вот так вот переделал код. Проблема осталась

Код:
//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;
}


Код:
//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
1.8K
28 марта 2007 года
k3Eahn
365 / / 19.12.2005
Млин, компилятор оказывается в этом не виноват:D:
Полазил по Google Groups и наткнулся на вот это http://groups.google.ru/group/comp.lang.c++/browse_thread/thread/bb64c1f6334959f9/3bb65b512f6e5c89?lnk=gst.
Там рассмотрен аналогичный твоему вопрос и дана ссылка на материал, где объясняется это странное явление.
26K
29 марта 2007 года
mad_man
5 / / 28.03.2007
Ура! Все получилось:) . ОГРОМНОЕ СПАСИБО.:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог