0

这是我第一次尝试在我的函数中使用模板,但我似乎无法让它们工作。我在一个名为的文件中定义了我的函数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

难道我做错了什么?

4

3 回答 3

2

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

于 2013-05-26T14:40:37.063 回答
1

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

于 2013-05-26T14:39:45.700 回答
1

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

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

template void ddc::perform_resampling(std::vector<float> &data, unsigned int f1, unsigned int f2);
于 2013-05-26T14:42:15.660 回答