24°C
завтра: 17°C
Погода в Перми
24°C
ночью16°C
утром12°C
завтра17°C
Подробно
 63,98
−0.3558
Курс USD ЦБ РФна 20 июня
63,9794
−0.3558
 71,64
−0.5914
Курс EUR ЦБ РФна 20 июня
71,6377
−0.5914
PRM.Форум /Компьютеры Интернет Связь / Программирование /

Разделение реализации и объявления, шаблоны, VC++

  • Как такое сотворить? Если запихнуть и объявление, и реализацию в заголовочный файл (скажем, template.h), всё отлично работает. Стоит объявление засунуть, скажем, в template.h, а реализацию в template.cpp, компилятор начинает ругаться про error LNK2019: unresolved external symbol. Если классы не шаблонные, такое разделение никаких вопросов у VC++ не вызывает. В принципе, работает когда всё в одном файле, да и хрен с ним... Но во всех книжках по C++ долго пишется о необходимости разделения объявления и реализации... Только чтобы код к этим самым книжкам (скачанный с сайта издательства, то есть мои глюки исключены) компилировался, тоже приходится дописывать содержимое .cpp-файлов в конец .h- файлов... Что я не так делаю?

  • Без взгляда на код не разобраться. Там #include стоит?

  • Код -- какой угодно, лишь бы встречался хотя бы один шаблон.
    Ну, к примеру, такой:
    //dumbClass.h
    template
    class dumbClass
    {
    private:
    T item;
    public:
    void assignValue(T val);
    };

    //dumbClass.cpp
    #include "dumbClass.h"

    template
    void dumbClass::assignValue(T val)
    {
    item = val;
    }


    //templatez.cpp
    #include "dumbClass.h"

    int _tmain(int argc, _TCHAR* argv[])
    {
    dumbClass k;
    k.assignValue(10);
    return 0;
    }

    Всякие дополнительные вещи, без которых это дело работать не будет (в зависимости от компилятора, типа "stdafx.h" для VS .Net), включались.
    Если dumbClass.cpp дописать в конец dumbClass.h, то всё работает. Если оставить как есть -- ошибка. Само собой, оба файла (и .h и .cpp) в проект включены. Я тут с гуглом посоветовался, там умные люди тоже говорят о необходимости сшивать объявление и реализацию в один .h-файл... Понятно, что так оно работает, а по-другому не работает. Но почему?? И как тогда без этого обходятся товарищи, пишущие книжки по C++?

  • В ответ на: Что я не так делаю?
    И объявления, и реализация шаблонов ДОЛЖНЫ находится в .h файле.

    Поскольку в .cpp по определению должно быть то, что генерирует код. Шаблон же по своей сути не генерирует никакого кода, пока ты не создаешь класс, на основе этого шаблона.

  • Согласен... Но вот только, читаешь, например, товарища R. Lafore, Object-Oriented Programming in C++, или Дейтелов C++ How To Program... И везде идет отделение интерфейса от реализации. Но код, скачанный с их сайтов, нихрена не работает пока его в один файл не запихаешь... Как-то ведь мужики книжки писали... :а\?:

  • Т.е. код именно шаблонов?

  • Угу. Приходится всё, что написано в .cpp-файлах дописывать в .h-файлы, после этого проблема исчезает. Если шаблонов нет, никаких изменений не требуется. Правда, у Лафоре есть какая-то самодельная библиотека для консольной псевдографики, там шаблонов не видно, но глюк тот же самый.

  • Вот здесь (по английски) кратко, но доходчиво описана эта проблема:
    http://sowell.ecs.fullerton.edu/cs331/TemplateClasses.html

Записей на странице:

Перейти в форум

Модератор: