0

重複の可能性:
未定義の参照/未解決の外部シンボル エラーとは何ですか? また、どのように修正すればよいですか?

次のように、配列の要素から中央値を見つける中央値関数があります

中央値.h

template <class N>
N median (N*,size_t);

中央値.cpp

#include "median.h"
template <class N> 
 N median (N* numbers,size_t size){
    size_t mid = size/2;
    return size % 2 == 0? (numbers[mid] + numbers[mid-1])/2 : numbers[mid];
}

主要

#include <iostream>
#include "median.h"

using namespace std;

int main(){
    double Numbers [] = {1,2,3,4,5,6,7};


    size_t size = sizeof(Numbers)/sizeof(*Numbers);

    double med = median(Numbers,size);
    cout << med << endl;
    return 0;

}

しかし、次のエラーが表示されます

main.obj : error LNK2019: unresolved external symbol "double __cdecl median<double>(double *,unsigned int)" (??$median@N@@YANPANI@Z) referenced in function _main
4

2 に答える 2

1

テンプレートは、使用する前にコンパイラによってインスタンス化する必要があります。テンプレートmedian.hの宣言があり、その実装がありますが、そのファイルでは使用しないため、テンプレートはそのファイルでインスタンス化されません。反対側では、テンプレートをインスタンス化しようとしますが、実装はなく、宣言だけです! そのため、コンパイラはテンプレートの実装のインスタンス化に失敗し、それがエラーの原因です。以下を使用して、実装をテンプレートに移動するか、テンプレートをインスタンス化するだけです。medianmedia.cppmain.cppmedian.hmedian.cpp

template double median<double>(double*, size_t);
于 2012-10-20T18:02:43.113 に答える
0

をメインに配置するか#include "median.cpp"、テンプレートの実装をヘッダー ファイルに移動できます。median.h

于 2012-10-20T17:52:51.430 に答える