2013-05-26 85 views
0

這是我第一次嘗試在我的函數中使用的模板,但我似乎無法使他們的工作。我在一個叫ddc.hppC++:調用從模板函數main()

#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; 
} 

與海灣合作委員會(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 

我做錯了什麼?

+0

你不能界面自定義喜歡你的函數和方法做分開,這是這麼簡單,你需要聲明,並在同一個地方定義模板,原因是如果你願意明確閱讀關於模板的內容,但總之,第一塊代碼對編譯器來說沒有意義,並且缺少模板定義。 – user2384250

回答

1

你需要把你的模板實現的頭了。

2

模板定義需要去聲明,所以一切都需要在頭文件。

1

您需要將模板函數的定義放置在對使用它的代碼可見的位置使用顯式模板實例化來確保生成該函數的代碼。

如果你不希望暴露的perform_resampling的FPGA實現你仍然可以強制編譯器生成明確它的代碼。當置於ddc.cpp下面線將指示編譯器產生的代碼爲perform_resampling採取vector<float>,因爲它的第一個參數。

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