未定义对向量<String> g++ 链接器错误的引用[重复]

Posted

技术标签:

【中文标题】未定义对向量<String> g++ 链接器错误的引用[重复]【英文标题】:undefined reference to vector<String> g++ linker error [duplicate] 【发布时间】:2013-02-07 11:16:21 【问题描述】:

我已经编译了我的源文件 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中包含以下顺序中的头文件

#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&)'

你能帮我解决这个问题吗

【问题讨论】:

#include 应该是#include 或#include using namespace std;?? @spin_eight 只是 &lt;iostream&gt; ,所有标准 C++ 头文件都没有 .h.h 变体是标准前遗留 无关:我建议不要在您自己的代码中使用-w 我觉得如果你把Vector实现放到h文件中或者将cpp文件包含到h文件中应该没问题。 【参考方案1】:

您没有向我们展示Vector 的定义位置和方式,而只是 一个猜测:你正在编译一个Vector.c。如果这个文件包含 模板的实现,你做错了;这 模板的实现必须在模板可见时 被实例化。您可以将其放在标题中,或者 包括头文件中的源代码,但您不编译 来源。

此外,大多数编译器认为.c 是 C 源代码,而不是 C++。你几乎肯定想改变你的名字 来源.cpp.cc。当你在它的时候,我会改变 纯 C++ 头文件的名称。虽然无处不在,但使用 C 头文件和纯 C++ 的命名约定相同 标题可能会令人困惑。

最后,C 标准头文件的&lt;name.h&gt; 形式是 不标准;如果他们在场(他们通常不在场),他们 应该引用该库的较旧的预标准版本。 (从你的错误信息来看,这显然不是 情况。)

【讨论】:

:感谢您提供的信息。我已经更新了我的问题,即提供了“vector.c”和“vector.h”的代码,请您检查并告诉我【参考方案2】:

你所有的错误都与模板函数有关。

请记住,在定义模板时,您必须将定义放在标题中,而不是放在.cpp 文件中。其他模块需要该定义来执行它们自己的模板实例化。

所以一个快速的解决方法是在Vector.h 的末尾做一个简单的#include "Vector.c"

或者将整个模板实现放在.h 文件中。


(对于 C++ 源文件,请使用 .cpp 而不是 .c;对于 C++ 头文件也可以使用 hpp

【讨论】:

以上是关于未定义对向量<String> g++ 链接器错误的引用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

根据关联的整数向量对字符串向量进行排序[重复]

如何在二维向量的定义位置插入向量?

C++模板

使用 fmt 链接错误:未定义对 `std::string fmt::v6::internal::grouping_impl<char>(fmt::v6::internal::locale

C ++ / Eclipse中的未定义符号错误[关闭]

使用空格将字符串拆分为向量 c++ 错误