Компиляция шаблонов - PullRequest
0 голосов
/ 11 июня 2011

Может кто-нибудь объяснить мне, как я могу избежать ошибки ниже?

Я думаю, что следую всему, что я прочитал при компиляции шаблона, но все равно получаю ошибку.Извините за вопрос - кажется тривиальным, но я застрял!

Спасибо, Паоло

1>------ Build started: Project: BitsAndPieces, Configuration: Release Win32 ------
1>  NonTemplateFunctionFriend_main.cpp
1>NonTemplateFunctionFriend_main.obj : error LNK2001: unresolved external symbol "public: int __thiscall Paolo<int>::getMyOnlyMember(void)" (?getMyOnlyMember@?$Paolo@H@@QAEHXZ)
1>\\na-13\agnolucp\my documents\visual studio 2010\Projects\BitsAndPieces\Release\BitsAndPieces.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

main

#include "NonTemplateFunctionFriend.h"
#include<iostream>
using namespace std;


int main() { 
    Paolo<int> Me;
    cout << Me.getMyOnlyMember() << endl;
    return 1;
}

NonTemplateFunctionFriend.h

#ifndef NonTemplateFunctionFriend_H
#define NonTemplateFunctionFriend_H

    #include <iostream>

    template<class T> class Paolo {

    private:
        T myOnlyMember;
    public:
        Paolo(): myOnlyMember(1000) {};
        T getMyOnlyMember();
    };

    #include "NonTemplateFunctionFriend.cpp"

#endif

NonTemplateFunctionFriend.cpp

#ifndef NonTemplateFunctionFriend_CPP
#define NonTemplateFunctionFriend_CPP

    #include "NonTemplateFunctionFriend.h"

    template<class T>   T getMyOnlyMember() {
            return myOnlyMember;
    }


#endif

Ответы [ 5 ]

1 голос
/ 11 июня 2011
#ifndef NonTemplateFunctionFriend_H
#define NonTemplateFunctionFriend_H

    #include <iostream>

    template<class T> class Paolo {

    private:
        T myOnlyMember;
    public:
        Paolo(): myOnlyMember(1000) {};
        T getMyOnlyMember();
    };

   template<class T>
   T Paolo<T>::getMyOnlyMember() {
            return myOnlyMember;
    }


#endif
0 голосов
/ 11 июня 2011

Паоло: Ваш код не связывается, потому что ваш код не определяет функцию-член `Paulo :: getMyOnlyMember. У вас есть определение в NonTemplateFunctionFriend.cpp, которое выглядит примерно так, как вам нужно, но для компилятора это совершенно другой шаблон функции.

Тем не менее, никогда сделать это в заголовке:

#include "NonTemplateFunctionFriend.cpp"

Никогда не делайте этого в заголовке, либо:

template<class T>
T Paolo<T>::getMyOnlyMember() {
    return myOnlyMember;
}

Проблема здесь в том, что если несколько файлов включают заголовок и создают getMyOnlyMember для одного и того же типа, у вас будет несчастный компоновщик. Добавьте классификатор inline, и все будет круто.

0 голосов
/ 11 июня 2011

Вы определили свободную функцию в NonTemplateFunctionFriend.cpp, а не функцию-член Paolo<T>:

    template<class T>   T Paolo<T>::getMyOnlyMember() {
            return myOnlyMember;
    }

То есть вы пропустили Paolo<T>:: в определении.

0 голосов
/ 11 июня 2011

Вы можете отделить файл, если вы включаете его в заголовочный файл (шаблоны должны быть полностью определены в одной и той же единице перевода, не имея надлежащей поддержки ключевого слова экспорта).

Но вы 'не определяете определение вашей функции с классом

Paolo<T>::
0 голосов
/ 11 июня 2011

Код шаблона должен быть определен перед использованием, а не только объявлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...