2

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

私はこれを2日間理解しようとしています。

これが私が得ているリンカエラーです:

main.cpp:17: undefined reference to `std::unique_ptr<Foo, std::default_delete<Foo> > Bar::make_unique_pointer<Foo>()'

以下のコードは、私が抱えている問題を示しています。

Bar.h

class Bar {
public: 
    template <class T>
    std::unique_ptr<T> make_unique_pointer();
};

Bar.cpp

#include "Bar.h"

template <class T>
std::unique_ptr<T> Bar::make_unique_pointer() {
    return std::unique_ptr<T>(new T());
}

main.cpp

#include "Bar.h"

struct Foo {};

int main() {
    Bar bar;
    auto p = bar.make_unique_pointer<Foo>();  
    return 0;
}

ただし、関数をインラインで定義すると機能します

class Bar {
public:
    template <class T>
    std::unique_ptr<T> make_unique_pointer() {
        return std::unique_ptr<T>(new T());
    }
};

または、定義を入れmain.cppたり、入れたりBar.hすると、正常にコンパイルされます。

それらが別々のファイルにある場合にのみ、リンカーエラーが発生します:/

4

1 に答える 1

2

関数テンプレートは、それらが作成されたのと同じファイルに実装する必要があります。理由については、この回答を参照してください

于 2012-11-15T17:16:17.410 に答える