注意:我制作了一个DFH_lib.CPP,其中包含了fstream和iomanip。我将所有模板函数保存在DFH_lib.CPP中。现在,如果我在MAIN.CPP中编写剩余的NON-TEMPLATE函数并包含DFH_lib.h,那么它就会成功运行。我不明白为什么......
我正在使用模板制作数据文件处理库。我创建了两个文件:
DFH_lib.CPP
Lib_Test.CPP
我制作了一个项目并点击了#34; Build All"正在编译中。我遇到了以下链接器错误:
模块DFH_LIB.CPP中定义的file_init(char near *)在模块LIB_TEST.CPP中重复
模块DFH_LIB.CPP中定义的AddColumn(const int near&)在模块LIB_TEST.CPP中重复
file_init(char*);
和AddColumn(T data, const int& width);
以及AddColumn(const int& width);
是我仅在DFH_lib.CPP中定义的函数。我只在Lib_Test.CPP中调用了这些函数。
DFH_lib.CPP
template <class T> //Function belongs to Pretty Printing Libary
void AddColumn(T data, const int& width) {
cout<<setw(width)<<data<<" | ";
}
void AddColumn(const int& width) {
cout<<setw(width)<<setfill('_')<<"|";
}
void file_init(char* file) { //File initialization function
ofstream fout;
fout.open(file, ios::binary|ios::noreplace); //File Created, noreplace prevents data loss
fout.close();
}
Lib_Test.CPP
cout<<endl; AddColumn(record_id,7); AddColumn(char_member, 20); AddColumn(int_member, 11); AddColumn(float_member, 13);
file_init(file); //initializes the file
其中&#34;文件&#34;定义为:char file[]="lib_Test.dat";
有人可以解释为什么我收到此链接器错误?我不明白这意味着什么,因此,如何解决它......
修改 我注意到这可能是由于在包含文件时出错而导致的,因为我将Lib_Test.CPP转换为&#34; Hello World&#34;程序和出现相同的错误。还有一件事我注意到:只有非模板函数导致链接错误!
DFH_lib.CPP
#ifndef _DFH_lib_cpp
#define _DFH_lib_cpp
#include<fstream.h>
#include<conio.h>
#include<stdio.h>
#include<iomanip.h>
#include<string.h>
.....
#endif
Lib_Test.CPP
#include<iostream.h>
#include<conio.h>
#include"DFH_lib.CPP" //Including DFH Libary
答案 0 :(得分:0)
我看到了以下问题的原因:
编译错误
旧 TC ++ 有时会编译模板问题,通常会添加空行(在正确的位置)或交换一些代码行帮助。但是,这通常仅在您的源代码达到30-50 Kbyte
这样的特定大小时才会开始,而不再确定它在很久以前的价值。我不相信这是你的问题。
真的重复
如果您多次包含某个文件,则会导致像您这样的错误。要解决这个问题,您可以将每个文件封装到此:
#ifndef _DFH_lib_cpp
#define _DFH_lib_cpp
// here comes your file DFH_lib.cpp content
#endif
其中_DFH_lib_cpp
令牌是您正在封装的编码文件名。这将丢弃任何重复包含。这也解决了存在全局变量的问题,但要小心,如果没有正确包含,它们在整个项目中可能不一样。