C ++:从main()调用模板化函数

时间:2013-05-26 14:38:16

标签: c++ templates gcc undefined-reference

这是我第一次尝试在我的功能中使用模板,但我似乎无法让它们起作用。我在一个名为ddc.hpp

的文件中定义了我的函数
#ifndef __DIGITAL_DOWN_CONVERTER_H__
#define __DIGITAL_DOWN_CONVERTER_H__
namespace ddc {
    template <class T> void perform_resampling(std::vector<T> &, unsigned int, unsigned int);
}
#endif

并在ddc.cpp

中实施
#include "ddc.hpp"
template <class T>
void ddc::perform_resampling(std::vector<T> &data, unsigned int f1, unsigned int f2) {
    // do stuff
}

这是我的main.cpp

#include "ddc.hpp"
int main() {
    std::vector<float> v (100000);
    ddc::perform_resampling(v, 1000, 10);

    return 0;
}

使用gcc(linux)进行编译我收到以下错误:

$ g++ -c ddc.cpp -o ddc.o -Wall -O3 -lm -m64
$ g++ -c main.cpp -o main.o -Wall -O3 -lm -m64
$ g++ ddc.o main.o -o ../bin/resampler

main.o: In function `main':
main.cpp:(.text.startup+0xed): undefined reference to `void ddc::perform_resampling<float>(std::vector<float, std::allocator<float> >&, unsigned int, unsigned int)'
collect2: ld returned 1 exit status
make: *** [../bin/HW_3] Error 1

我做错了吗?

3 个答案:

答案 0 :(得分:2)

模板定义需要与声明一起使用,因此所有内容都需要在头文件中。

答案 1 :(得分:1)

您还需要将模板实现放在标题中。

答案 2 :(得分:1)

您需要将模板函数的定义放在使用它的代码可见的位置使用显式模板实例化以确保生成函数的代码。

如果您不想公开perform_resampling的实现,您仍然可以强制编译器为其显式生成代码。放置在 ddc.cpp 中的以下行将指示编译器生成perform_resampling的代码,并将vector<float>作为其第一个参数。

template void ddc::perform_resampling(std::vector<float> &data, unsigned int f1, unsigned int f2);