typedef和模板的未定义符号? [复制]

Posted

技术标签:

【中文标题】typedef和模板的未定义符号? [复制]【英文标题】:Undefined symbols for typedef and template? [duplicate] 【发布时间】:2012-02-13 16:54:13 【问题描述】:

这看起来很简单,但我不知道出了什么问题。我正在实现 C++ 向量类(仅适用于 int,而不是模板),并且带有迭代器模板或 typedef 的函数在编译时给了我这些错误:

Undefined symbols:
  "void vectorInt::assign<int>(int, int)", referenced from:
      _main in ccNVdR23.o
  "void vectorInt::assign<int*>(int*, int*)", referenced from:
      _main in ccNVdR23.o
      _main in ccNVdR23.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

源文件的重要部分是:

vectorInt.h

#include <cstdlib>
#include <stdexcept>

typedef unsigned int size_type;

class vectorInt 
private:
    int* array;
    size_type current_size;
    size_type current_capacity;
public:
    .
    .
    .
    template <class InputIterator>
        void assign(InputIterator first, InputIterator last);
    void assign(size_type n, const int u);
;

#endif // VECTORINT_H

vectorInt.cpp

#include vectorInt.h
.
.
.
template <class InputIterator>
void vectorInt::assign(InputIterator first, InputIterator last) 
    clear();
    InputIterator it = first;
    int count = 0;
    while(it++ != last) 
        count++;
    

    reserve(count);
    while(first != last) 
        this->push_back(*first++);
    


void vectorInt::assign(size_type n, const int u) 
    clear();
    reserve(n);

    for(int i=0; i<(int)n; i++)
        push_back(u);

main.cpp

#include <cstdlib>
#include <stdexcept>
#include <iostream>
#include "vectorInt.h"

using namespace std;

int main(int argc, char** argv) 
    vectorInt first;
    vectorInt second;
    vectorInt third;

    first.assign(7, 100);

    vectorInt::iterator it;
    it = first.begin()+1;
    second.assign(it, first.end()-1); // the 5 central values of first

    int myints[] = 1776,7,4;
    third.assign(myints, myints+3);   // assigning from array.  

    return 0;

仅供参考:我知道 main 方法使用 vectorInt::iterator,但这不是问题,因此我没有将它包含在源代码中。

【问题讨论】:

【参考方案1】:

模板代码得到阶段编译。第一阶段仅包括基本的语法检查。第二阶段依赖于类型 T,从编译器获得完整编译。类/函数将根据类型T 进行实例化,第二阶段编译将针对该类型运行。

由于您的代码(实现)在.cpp 文件中,它只会进行第一阶段编译,因此不会包含在翻译单元中 - 不会生成目标文件。

对于模板,您必须允许编译器编译整个代码。同样,您只需将整个实现放在头文件中。你也可以在类声明之后#include各自的.cpp文件。

【讨论】:

啊,我明白了。我继续将实现添加到头文件中,错误消失了,但现在很难区分这两种方法,我相信这是因为我没有将类作为模板,而只是整数。再次感谢。【参考方案2】:

将分配函数的代码放在头文件(vectorint.h)中,应该没问题。模板的代码需要在实例化时可见,在您调用 assign 函数的情况下。

【讨论】:

以上是关于typedef和模板的未定义符号? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

架构 x86_64 的未定义符号将 QT 与 Opencv 结合使用

尝试编译 AFNetworking 2.0 时架构 i386 的未定义符号

我在ComplexNumber.cpp中的一些方法得到一个奇怪的未定义的错误引用,虽然[复制]我对模板很新

使用 CMake 的自定义 .h 和 cpp 的未定义符号 [关闭]

未定义符号 体系结构 x86_64 的未定义符号:“_kCFAllocatorDefault”

“架构 i386 的未定义符号”问题