模板编译

时间:2011-06-10 21:49:35

标签: c++ templates compilation

有人可以向我解释如何避免下面的错误吗?

我想我正在阅读有关模板编译的所有内容,但仍然会出错。很抱歉这个问题 - 看起来很微不足道但我被卡住了!

谢谢, 保罗

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 ==========

主要

#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 个答案:

答案 0 :(得分:1)

#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

答案 1 :(得分:0)

模板代码在使用前必须定义,而不仅仅是声明。

答案 2 :(得分:0)

只要您将文件包含在头文件中,就可以将文件分开(模板必须在同一个翻译单元中完全定义,缺少对export关键字的适当支持)。

但是你没有用类

来限定你的函数定义
Paolo<T>::

答案 3 :(得分:0)

您在非模板函数Friend.c ++中定义了一个自由函数,而不是Paolo<T>的成员函数:

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

也就是说,您错过了定义中的 Paolo<T>::

答案 4 :(得分:0)

Paolo:您的代码没有链接,因为您的代码没有定义成员函数`Paulo :: getMyOnlyMember。你在NonTemplateFunctionFriend.cpp中有一个看起来有点像你想要的定义,但对于编译器来说它是一个完全不同的函数模板。

那就是说,从不在标题中执行此操作:

#include "NonTemplateFunctionFriend.cpp"

从不在标题中执行此操作:

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

这里的问题是,如果多个文件包含标题并为同一类型创建一个getMyOnlyMember,那么您将拥有一个不愉快的链接器。添加inline限定符,一切都会很酷。