我已经编译了我的源文件mycpp.c的相关文件,并按照它们使用的顺序链接了这些文件。所有相关文件都可以在同一个文件夹中找到。
**//Compilation**
$ g++ -c -w -Wno-deprecated String.c Vector.c DPStream.c CJ_Base.c mycpp.c
**//Linking**
$ g++ -g -o myexe String.o Vector.o DPStream.o CJ_Base.o mycpp.o
Vector.h
#include <iostream.h>
#include <fstream.h>
#include <iomanip.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include "String.h"
#include "Storage.h"
template <class Object>
class Vector : public Storage{
public:
// ctors & dtor
Vector ();
Vector (int);
~Vector();
// overloaded operators
Object& operator[] (int nSubscript);
void operator<<(Object &);
void operator<<(char *);
// access methods
int Count(){return _iCurrElem;};
int Print(ofstream &);
void Flush();
Resize(int);
int IsType() {return VectorType;};
private:
long _iCurrElem;
Object *moj;
long _iUpperBound;
void _reserve(int);
};
#endif
Vector.c
---------
#include"Vector.h"
template <class Object>
Vector<Object>::Vector ()
{
moj = new Object[3];
}
template <class Object>
Vector<Object>::Vector (int e)
{
moj = new Object[e];
}
template <class Object>
Vector<Object>::~Vector ()
{
delete[] moj;
}
template <class Object>
Vector<Object>::operator<<(Object &)
{
//stmt
}
template <class Object>
Vector<Object>::operator<<(char* ch)
{
//stmt
}
template <class Object>
Vector<Object>::Print(ofstream &foutput)
{
//stmt
}
在mycpp.h
中包含以下orde中的头文件#include <iostream.h>
#include <fstream.h>
#include <iomanip.h>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include "String.h"
#include "Vector.h"
#include "DPStream.h"
#include "CJ_Base.h"
但是g ++编译器仍会抛出错误 粘贴在链接错误
之下 DPStream.o: In function `DPStream::operator<<(Vector<String>&)':
DPStream.c:(.text+0x396): undefined reference to `Vector<String>::Print(std::basic_ofstream<char, std::char_traits<char> >&)'
mycpp.o: In function `mycpp::ProcessFile()':
mycpp.o:(.text+0x24e): undefined reference to `Vector<String>::operator<<(String&)'
mycpp.o:(.text+0x2e5): undefined reference to `Vector<String>::operator<<(char*)'
mycpp.o:(.text+0x310): undefined reference to `Vector<String>::Flush()'
mycpp.o:(.text+0x32b): undefined reference to `Vector<String>::operator<<(String&)'
mycpp.o:(.text+0x346): undefined reference to `Vector<String>::operator<<(String&
mycpp.o: In function `mycpp::~mycpp()':
mycpp.o:(.text+0x24e): undefined reference to `Vector<String>::operator<<(String&)'
你能帮我解决一下这个问题吗
答案 0 :(得分:1)
您没有告诉我们Vector
的定义位置和方式,只是
猜测:你正在编译Vector.c
。如果此文件包含
模板的实现,你做错了;该
模板的实现必须在模板时可见
被实例化。你可以把它放在标题中,或者
包括标头中的源,但你不编译
源。
此外,大多数编译器认为.c
是C源,而不是
C ++。你几乎肯定想改变你的名字
来自.cpp
或.cc
的来源。当你在它的时候,我会改变它
纯C ++标头的名称也是如此。虽然无处不在,使用
C头和纯C ++的相同命名约定
标题可能令人困惑。
最后,C标准头文件的<name.h>
形式是
不标准;如果它们存在(它们通常不存在),它们
应该参考旧的预标准版本的库。
(从您的错误消息判断,这显然不是
案例。)
答案 1 :(得分:0)
您的所有错误都与模板功能有关。
请记住,在定义模板时,您必须将定义放在标题中,而不是放在.cpp
文件中。其他模块需要定义来执行自己的模板实例化。
因此,快速解决方法是在#include "Vector.c"
结束时执行简单的Vector.h
。
或者将整个模板实现放在.h
个文件中。
(对于C ++源文件,请使用.cpp
而不是.c
;对C ++标头使用hpp
也很不错)