2017-01-27 9 views
0

私はテンプレートクラスに持ってエクスターナル・テンプレート:宣言が宣言されていないもの

expof.h:私は繰り返し、例えばのための私のコード全体で使用

template <class T> 
class ExpOf{ 
... 
} 

T = double [およびその他のクラスExpOfについては何も知らないはずです。] は、だから私はexpofdouble.cpp

[...か二度]きっぱりとそれをコンパイルすることをお勧めだろうと思った:

#include "expof.h" 
template class ExpOf<double>; 

、それがないように別のヘッダで宣言しますexpof.hがインクルードされたときにコンパイルされます。

expofdouble.h:

extern template ExpOf<double>; 

私はこれをコンパイル(打ち鳴らす-800.0.42.1)のI取得(多数)の警告が

expofdouble.h: warning: declaration does not declare anything [-Wmissing-declarations] 
extern template ExpOf<double>; 
       ^~~~~~~~~~~~~ 

私は希望の動作を取得していますか?それではなぜ警告?私はこれを違うはずか?

答えて

0

expofdouble.hは、この行を含める必要があります。

extern template class ExpOf<double>; 

あなたの宣言はclassキーワードを省略し、それは実際には何も宣言していません。

(あなたはかなり明らかにあなたのために何も有効ではありません extern int;のような宣言は、同じ警告を受けるだろうことに注意してください。)

+0

おかげで、それはあなたのコメントの後に、プレーンと簡単でした。 しかし、明示的にデフォルトの移動コンストラクタをインスタンス化しない 'テンプレートクラス'のためにコンパイラ依存のリンク時間エラーが発生しています... これはいくつかのコンパイラの既知のバグであるようです(http:それが誰かを助ける場合は、/ stackoverflow.com/questions/38929950/automatic-constructor-in-explicitly-instantiated-class-template)を参照してください。 – Lio

関連する問題