2

重複の可能性:
テンプレートをヘッダーファイルにのみ実装できるのはなぜですか?

テンプレートタイプのベクトルを返す関数をコンパイルするのに問題があります。テンプレートを削除して。に置き換えると、コードがコンパイルされdoubleます。また、この問題は、関数定義とプロトタイプが同じファイルにない場合にのみ発生します。私は以下を使用してコンパイルします:

g++ func.cpp main.cpp

main.cpp:

#include <vector>
#include "func.h"

int main(int argc, char** argv)
{
    double x_min = 0.0;
    double x_max = 1.0;
    int N = 20;
    std::vector<double> x = linspace(x_min,x_max,N);

    return 0;
}

func.cpp:

#include "func.h"

template <class T>
std::vector<T> linspace(T x1, T x2, int N)
{
    std::vector<T> x(N);
    if(N == 1)
    {
        x[0] = x2;
        return x;
    }

    T delta_x = (x2-x1)/(N-1);

    for(int ii = 0; ii < N; ii++)
    {
        x[ii] = x1 + ii*delta_x;
    }

    x[N-1] = x2;
    return x;
}

func.h:

#include <vector>

template <class T>
std::vector<T> linspace(T x1, T x2, int N);

コンパイラーは次の出力を生成します。

/tmp/cclptwq7.o: In function `main':
main.cpp:(.text+0x45): undefined reference to `std::vector<double, std::allocator<double> > linspace<double>(double, double, int)'
collect2: ld returned 1 exit status
4

2 に答える 2

2

テンプレート クラスはファイルに分割しないで.hppください.cpp

メンバー関数の実装もコンパイル単位 (たとえば、main.cpp) に含める必要があります。そうしないと、コンパイラは、テンプレート引数として指定した型を使用してテンプレート クラスを構築する方法を知ることができません。にもできます#include "func.cpp"main.cpp、それは醜いでしょう。

David が示唆したように、興味がある場合はhttps://stackoverflow.com/a/3040706/713961で詳細情報を確認できます。

于 2013-01-28T17:16:15.627 に答える
0

テンプレートは同じファイルで定義する必要があります。そうしないと、リンカー エラーが発生します。詳細については、この回答を参照してください。

于 2013-01-28T17:16:47.780 に答える