49

テンプレートクラスを前方宣言する必要のあるコードがいくつかあります(または、少なくとも前方宣言を行うと、作業がはるかに簡単になります...)。私が抱えている問題の簡略版を書いたので、ここに表示できます。

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でコンパイルしています。

4

3 に答える 3

35

テンプレートであるかどうかにかかわらず、任意の型の変数を宣言するには、その型の定義全体が利用可能でなければなりません。テンプレートを前方宣言してから、それが定義されているかのように使用することはできません。その時点でできることは、次のように、テンプレートに基づく型のオブジェクトへのポインターを宣言することだけです。

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

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

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

于 2012-10-09T09:50:16.973 に答える
1

何かを前方宣言してからスタックでインスタンス化できないことは私の理解からです(テンプレートであろうとなかろうと)。

また、テンプレート クラスの前方定義が広くサポートされているとは思えません。

于 2012-10-09T09:48:51.953 に答える