Включить заголовочный файл типа шаблона - PullRequest
3 голосов
/ 10 февраля 2012

Я пишу шаблон класса, скажем,

template <class T>
class bla {
    bla() ;
    ~bla() ;
};

template <class T>
bla<t>::bla(){}

template <class T>
b<t>::~b(){}

Это прекрасно работает, пока T int, char и т. Д. ... но в случае, если это будет пользовательский класс MyClass, потребуется файл заголовка MyClass.h или я не прав?

Вопрос: Как это можно сделать способом шаблона, т.е. что-то вроде

#include "T.h"

Ура! * * 1013

Ответы [ 2 ]

4 голосов
/ 10 февраля 2012

Когда вы используете bla<MyClass>, вам необходимо включить определение bla и определение MyClass.Не обязательно, чтобы MyClass было известно, когда определено bla.Волшебство этого называется «поиск по двухфазному имени»: при составлении определения шаблона ищутся все имена, не зависящие от параметра шаблона.На втором этапе, когда создается экземпляр шаблона, все оставшиеся имена ищутся в контексте создания экземпляра.

1 голос
/ 10 февраля 2012

Ну, все наоборот.Если у вас есть класс MyClass, который вы хотите использовать в одном из ваших модулей (блоки перевода в C ++), тогда вы включите контейнер шаблона (исходный код, который вы поместили выше, назовем его container.h), а затемсоздайте структуру данных.

// main.cpp

#include "container.h"
#include "myclass.h"

int main()
{
    bla<MyClass> foo;

    // lots of more things...
}

Возможно, проблема в том, что вы не знаете, как разделить ваш код на модули.Простое практическое правило - поместить каждый класс в один модуль, каждый модуль с файлом .h (интерфейс, в котором лежат все объявления), и файл .cpp (файл реализации, где примерно вы пишете внутриметоды).

Надеюсь, это поможет.

...