externテンプレートを理解しようとしていますが、動作させることができません。私の目標は、コンパイル時間を節約するために、別のコンパイルユニットにFoo<>
がある場合、いくつかのインスタンスをコンパイルすることです。私のコードベースでは、テンプレートの引数はenum class
なので、理論的に私はコンパイル単位ですべてのインスタンスをコンパイルし、残りのプロジェクトとリンクすることができます。externテンプレートをC++で理解する
//Foo.hpp
#pragma once
template <class T>
struct Foo {
Foo();
~Foo();
};
extern template struct Foo<int>;
//Foo.cpp
#include "Foo.hpp"
template struct Foo<int>;
//main.cpp
#include <iostream>
#include "Foo.hpp"
int main(int argc, char **argv) {
Foo<int> foo;
return 0;
}
:ここ
は、私が思い付く少し例です
g++ -c ../Foo.cpp ../main.cpp
g++ Foo.o main.o
私はGCC 7.1.1で取得し、打ち鳴らす4.0.1と基本的に同じ出力は、次のとおりです。
main.o: In function `main':
main.cpp:(.text+0x27): undefined reference to `Foo<int>::Foo()'
main.cpp:(.text+0x38): undefined reference to `Foo<int>::~Foo()'
私の主な質問は、なぜFoo<int>::Foo()
とFoo<int>::~Foo()
はFoo.o
にコンパイルされていませんか?
コンストラクタとデストラクタが何をするのかをコンパイラに知らせるために、何も提供していないからです。彼らは2つの数字を追加しますか? 2つの数字を減算しますか? 「戦争と平和」の言葉の数を数えますか?ピンの先端にある天使の数を数えますか?コンパイラがインスタンスを生成するためには、コンストラクタをどこかに記述する必要があります。 –