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

テンプレート関数の定義を、それを使用するコードから見える場所に配置する、明示的なテンプレートのインスタンス化を使用して、関数のコードが生成されるようにする必要があります。

の実装を公開したくない場合perform_resamplingでも、コンパイラにそのコードを明示的に生成させることができます。次の行を配置すると、最初のパラメーターとしてaddc.cppを受け取るコードを生成するようコンパイラーに指示します。perform_resamplingvector<float>

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

テンプレートの実装もヘッダーに配置する必要があります。

于 2013-05-26T14:39:45.700 に答える