【发布时间】:2018-02-05 20:27:26
【问题描述】:
注意:我制作了一个 DFH_lib.CPP,其中包含 fstream 和 iomanip。我将所有模板函数保存在 DFH_lib.CPP 中。现在,如果我在 MAIN.CPP 中编写剩余的 NON-TEMPLATE 函数并仅包含 DFH_lib.h,那么它就会成功运行。我不明白为什么...
我正在使用模板制作一个数据文件处理库。我创建了两个文件:
DFH_lib.CPP
Lib_Test.CPP
我做了一个项目,点击编译下的“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
其中“文件”定义为:char file[]="lib_Test.dat";
有人可以解释为什么我会收到此链接器错误吗?我不明白这是什么意思,因此,如何解决它......
编辑: 我注意到这可能是由于在包含文件时发生的错误导致的,因为我将 Lib_Test.CPP 变成了“Hello World”程序并出现了相同的错误。我还注意到一件事:只有非模板函数会导致链接错误!
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
【问题讨论】:
-
您需要将
#defines添加到每个文件,同样也添加到lib_Test.cpp,问题也可能是模板的使用创建了一个已经存在的原型。char_member和int_member是如何定义的?如果它们相同,则可能是原因...包含层次结构看起来不错,因此它要么是模板中的错误,要么是其用法中的错误,没有完整的源代码我看不到...尝试执行MCVE(最小可编译可验证示例...在您的情况下不可编译:)) -
给我时间,我这周有 3 门考试
-
在您使用
@spektre进行编辑后通知我