-1

私は単純なテンプレート機能を持っています、

ああ

#include <iostream>
#include <vector>

using namespace std;

template<class T>
pair<T, T> GetMatchedBin(T, vector<pair<T, T> >);

A.cpp

#include "A.h"

template<class T>
pair<T, T> GetMatchedBin(T val, vector<pair<T, T> > &bins)
{
    for(unsigned int i=0; i<bins.size(); i++){
        if(val >= bins[i].first && val < bins[i].second)
            return bins[i];
    }
    return pair<T, T>();
}

私が経由して呼び出す、

main.cpp

#include <iostream>
#include <vector>
#include "A.h"

using namespace std;

int main()
{
    vector<pair<int, int> > bins;
    bins.push_back(pair<int, int>(0, 1));
    bins.push_back(pair<int, int>(1, 2));
    bins.push_back(pair<int, int>(2, 3));
    bins.push_back(pair<int, int>(3, 4));

    pair<int, int> matched_bin = GetMatchedBin(3, bins);

    cout << matched_bin.first << ", " << matched_bin.second << endl;

    return 0;
}

ただし、これをコンパイルしようとすると、エラーが発生します。

make
g++ -o temp temp.cpp A.o
/tmp/dvoong/ccoSJ4eF.o: In function `main':
temp.cpp:(.text+0x12a): undefined reference to `std::pair<int, int> GetMatchedBin<int>(int, std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > >)'
collect2: ld returned 1 exit status
make: *** [temp] Error 1

奇妙なことに、ヘッダーと .cpp ファイルに分割するのではなく、これをすべて 1 つのファイルで行うと、機能します...

これの原因は何ですか?

ありがとう

4

1 に答える 1

3

コンパイラは、コンパイル時にテンプレートの完全な定義を必要とします。したがって、テンプレート関数の定義はヘッダーにある必要があります。(専門にしない限り、C++ ファイルまたはインライン化する必要があります)

于 2013-07-24T14:03:02.293 に答える