2012-10-09 11 views
15

私は、テンプレートクラスを前方宣言する必要があるコードを持っています(または、少なくとも前方宣言すると、 ..)。私はコメント行で取得していますエラーがある"未定義のテンプレートの暗黙的なインスタンス化"は、前方に宣言するテンプレートクラス

template<bool> 
class MyTemplateClass; 

int main(int argc, char* argv[]) 
{ 
    MyTemplateClass<false> myTemp; // error here 
    myTemp.GetTheValue(); 
    return 0; 
} 

template<bool bShouldMult> 
class MyTemplateClass 
{ 
    int m_myint; 
    float m_myfloat; 

public: 
    MyTemplateClass() : m_myint(5), m_myfloat(3.0f) {} 
    float GetTheValue() 
    { 
     return m_myint * (bShouldMult ? m_myfloat : 1.0f); 
    } 

}; 

Error - implicit instantiation of undefined template 'MyTemplateClass<false>' 

他のどのような詳細私はので、私はここでそれを表示することができたんだ問題の簡易版を書きましたMyTemplateClassの前方宣言に含める必要がありますか?エラーは次の行から来ていないので、メソッドが定義されていないことが原因ではないと仮定しています。私が使用しているコンパイラはLLVM/CLangで、Macでコンパイルしています。

答えて

13

の前方定義のための非常に幅広い支持がないと思います。テンプレートを前方宣言して定義したように使用することはできません。あなたはその時点で行うことができますすべては、このように、テンプレートに基づいた型のオブジェクトへのポインタを宣言されています

MyTemplateClass<false> *myTempPtr; // No error here 

残念ながら(ただし、予想外に)これは次の行にエラーを移動します。そのポインタを初期化する問題は、一度new MyTemplateClass<false>を呼び出そうとすると、エラーが表示されます。

テンプレートの定義を使用場所より先に移動するには、コードを再配置する必要があります。これはやや面倒かもしれませんが、回避策はありません。コンパイラは、テンプレートのインスタンス化とメソッドの呼び出しを開始する時点で定義全体を保持する必要があります。

0

何かを宣言して、スタック(テンプレートかどうか)でインスタンス化することはできません。

はまた、私は、そのタイプの定義全体が利用可能でなければならない任意のタイプ、テンプレートまたはないの変数を宣言するために、テンプレートクラス

19

#includeを忘れましたか?

std::array

を使用している場合、私は

#include <array> 

に忘れ後にこれを得ました