未定义的引用

Rai*_*Sia 1 c++ linker-errors build-error undefined-reference

可能重复:
C++模板,未定义的引用

我有一个非常简单的程序,由三个文件组成,它们从普通数组构建向量:

//create.hpp

#ifndef CREATE_HPP_
#define CREATE_HPP_

#include <vector>

using namespace std;

template<class T>
vector<T> create_list(T uarray[], size_t size);

#endif /* CREATE_HPP_ */
Run Code Online (Sandbox Code Playgroud)
//create.cpp

#include "create.hpp"

template<class T>
vector<T> create_list(T uarray[], size_t size){
    vector<T> ulist(uarray, uarray + size);
    return ulist;
}
Run Code Online (Sandbox Code Playgroud)
//main.cpp

#include <vector>
#include <iostream>

#include "create.hpp"

using namespace std;


int main(){
    char temp[] = { '/', '>' };
    vector<char> uvec = create_list<char>(temp, 2);

    vector<char>::iterator iter=uvec.begin();
    for(;iter != uvec.end();iter++){
        cout<<*iter<<endl;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

构建过程如下:

g++ -O0 -g3 -Wall -c -fmessage-length=0 -o create.o create.cpp
g++ -O0 -g3 -Wall -c -fmessage-length=0 -o main.o main.cpp
g++ -o main.exe main.o create.o
Run Code Online (Sandbox Code Playgroud)

在构建程序时,我收到此错误:

main.o: In function `main':
../main.cpp:18: undefined reference to `std::vector<char, std::allocator<char> > create_list<char>(char*, unsigned int)'
Run Code Online (Sandbox Code Playgroud)

这个程序非常简单.但是,编译成功通过,但链接失败.然后我将所有代码移动到一个文件中,一切都像魅力一样.任何人都可以帮我解决这个问题吗?

Pav*_*sky 6

是.答案很复杂.它与模板在C++中的实际工作方式有关.

简短回答:完整的模板定义必须在头文件中,或者您必须有一个明确的实例化(例如http://msdn.microsoft.com/en-us/library/by56e477(v=vs.80).aspx)对于CPP文件中的给定类型.

长答案(原因):模板不是可以编译成二进制(对象)的代码.它们只是"创建代码的秘诀",只能在实例化过程中创建代码.这也是为什么模板的不准确使用可能导致编译时间过长和大于所需二进制文件的原因.