模板编译
Template Compilation
本文关键字:编译 更新时间:2023-10-16
有人能向我解释一下如何避免下面的错误吗?
我想我正在遵循我所读到的关于模板编译的所有内容,但仍然会出现错误。很抱歉问这个问题——这看起来微不足道,但我被卡住了!
谢谢,Paolo
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-13agnolucpmy documentsvisual studio 2010ProjectsBitsAndPiecesReleaseBitsAndPieces.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
#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
只要将文件包含在头文件中,就可以将其分离(模板必须在同一翻译单元中完全定义,缺少对导出关键字的适当支持)。
但是你没有用类来限定你的函数定义
Paolo<T>::
模板代码在使用前必须定义,而不仅仅是声明。
您在NonTemplateFunctionFriend.cpp中定义了一个自由函数,而不是Paolo<T>
:的成员函数
template<class T> T Paolo<T>::getMyOnlyMember() {
return myOnlyMember;
}
也就是说,您错过了定义中的Paolo<T>::
。
Paolo:您的代码没有链接,因为您的代码未定义成员函数`Paulo::getMyOnlyMember。NonTemplateFunctionFriend.cpp中确实有一个定义,看起来有点像您想要的,但对编译器来说,它是一个完全不同的函数模板。
也就是说,永远不要在标题中这样做:
#include "NonTemplateFunctionFriend.cpp"
Never在标头中执行此操作,或者:
template<class T>
T Paolo<T>::getMyOnlyMember() {
return myOnlyMember;
}
这里的问题是,如果多个文件包含头,并为同一类型创建一个getMyOnlyMember,则会出现不愉快的链接器。添加inline
限定符,一切都会很酷。