我想了解extern模板,但我不能得到它的工作。我的目標是編譯一些instanciations,如果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;
}
要進行編譯,我用一個makefile,這歸結爲:
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
?
因爲你沒有提供任何編譯器讓它知道構造函數和析構函數做什麼。他們添加兩個數字嗎?減去兩個數字?計算「戰爭與和平」中的單詞數量?計算引腳頂端的天使數量?您必須在某處編寫構造函數,以便編譯器實例化它。 –