Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Шаблоны


Автор: FelikZ 24.5.2007, 22:09
Возникла проблема с функциями в шаблонном классе. Если описывать функции в хеадер файлах то все компилится и
линкуется на ура, но если же перенести реализацию функций в отдельный файл(*.CPP), то все тоже компилится но
не линкуется - пишет что реализация данной функции ненайдена или:
Цитата

Error    2    error LNK2019: unresolved external symbol "public: bool __thiscall Resources::IResourceMgr<struct IDirect3DTexture9>::IsInit(void)" (?IsInit@?$IResourceMgr@UIDirect3DTexture9@@@Resources@@QAE_NXZ) referenced in function "public: virtual long __thiscall Resources::TextureMgr::Initialize(struct IDirect3DDevice9 *)" (?Initialize@TextureMgr@Resources@@UAEJPAUIDirect3DDevice9@@@Z)    RTextureMgr.obj
 

Вот так работает:
IResourceMgr.h
Код

#pragma once

namespace Resources
{
    template<typename TypeOf>
    class IResourceMgr
    {
    protected:
        vector<Resource<TypeOf>> _resources;
        bool _isInit;
    public:
        IResourceMgr<TypeOf>::IResourceMgr()
        {
            _isInit = false;
        }

        IResourceMgr<TypeOf>::~IResourceMgr()
        {
            _resources.clear();
        }

                  //....

        /* State of class */
        bool IsInit();
    };
    template<typename TypeOf>
    bool IResourceMgr<TypeOf>::IsInit()
    {
        return _isInit;
    }
}


Почему не работает так?:
IResourceMgr.h - только обьявление функции IsInit()
Код

#pragma once

namespace Resources
{
    template<typename TypeOf>
    class IResourceMgr
    {
    protected:
        vector<Resource<TypeOf>> _resources;
        bool _isInit;
    public:
        IResourceMgr<TypeOf>::IResourceMgr()
        {
            _isInit = false;
        }

        IResourceMgr<TypeOf>::~IResourceMgr()
        {
            _resources.clear();
        }

                  //....
                  //
                  // НЕТУ РЕАЛИЗАЦИИ см. "IResourceMgr.cpp"
                  //
        /* State of class */
        bool IsInit();
    };
}



IResourceMgr.cpp - реализация ф-и IsInit
Код

#include "StdAfx.h"
#include "RIResourceMgr.h"

namespace Resources
{
    template<typename TypeOf>
    bool IResourceMgr<TypeOf>::IsInit()
    {
        return _isInit;
    }
}

Автор: Hurricane 24.5.2007, 22:17
Патамучта темплейты не помещают в cpp. За исключением случаев, когда они используются только в этом cpp локально, но это плохая практика.

Автор: FelikZ 24.5.2007, 22:47
спасибо
но тогда интересно почему это дело компилится? пусть и не линкуется...

Автор: Daevaorn 24.5.2007, 23:01
Цитата(FelikZ @  24.5.2007,  23:47 Найти цитируемый пост)
но тогда интересно почему это дело компилится? пусть и не линкуется...

потому что, для компиляции реализация метода не нужна.

Автор: FelikZ 24.5.2007, 23:03
Daevaorn, Hurricane +1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)