0

重複の可能性:
「template」および「typename」キーワードをどこに、なぜ配置する必要があるのですか?

オブジェクトを作成し、目的のクラスをテンプレートパラメータとして渡すときに、スマートポインタを作成するクラスがあります。そして、別のクラスでそのスマートポインタを使用する必要がある別のクラスがあります。

#include <iostream>
using namespace std;

//スマートポインタクラス

template<typename T>
class IntrusivePtr
{
public:
    IntrusivePtr()
    {
        cout << "IntrusivePtr()";
    }
};

//テンプレートでもあるスマートポインタが必要なクラス

template<typename T>
class A
{
public:
    A()
    {
        cout << "A()";
    }
    typedef IntrusivePtr< A<T> > my_ptr;
};

//スマートポインタを使用するクラス。

template<typename T>
class B
{
public:
    B()
    {
        cout << "B()";
    }

    typedef A<T>::my_ptr x;
};



int main()
{
    B<int> ob;

    return 0;
}

これはC++で実現できますか?私は新しいC++11typedefがこのようなことをサポートしていることを知っていますが、私は古い標準を使用しています:(これをコンパイルするといくつかの悪いお尻のエラーが発生します:

C:\ Users \ jacob \ typedef_template_class-build-desktop-Qt_4_8_1_for_Desktop _-_ MSVC2008__Qt_SDK__Debug .. \ typedef_template_class \ main.cpp:41:エラー:C2146:構文エラー:欠落している';' 識別子'x'の前

C:\ Users \ jacob \ typedef_template_class-build-desktop-Qt_4_8_1_for_Desktop _-_ MSVC2008__Qt_SDK__Debug .. \ typedef_template_class \ main.cpp:41:エラー:C2146:構文エラー:欠落している';' 識別子'x'の前

C:\ Users \ jacob \ typedef_template_class-build-desktop-Qt_4_8_1_for_Desktop _-_ MSVC2008__Qt_SDK__Debug .. \ typedef_template_class \ main.cpp:41:エラー:C4430:型指定子がありません-intと見なされます。注:C++はdefault-intをサポートしていません

編集:申し訳ありませんが、私はいくつかのものとエラーコードを変更しました。これが私が望んでいることです。ごめん

4

2 に答える 2

3
template<typename T>
class B
{
public:
    B()
    {
        cout << "B()";
    }

    typedef typename A< B >::my_ptr x;
};

typenameなので、を使用する必要my_prtがありdependent nameます。

于 2012-09-06T14:37:30.203 に答える
3

あなたの問題はそれA<B>::my_ptrが依存名であるということです(それはB<T>テンプレートパラメータに依存し、したがって依存しますT)。このため、コンパイラは、テンプレートを解析するときに、それが型であるか変数であるかを認識しません。その状況では、my_ptr明示的にそう言わない限り、それはタイプではないと想定します。typenameしたがって、コンパイラが指示したように、を追加する必要があります。

typedef typename A< B >::my_ptr x;

より完全な説明については、同様の質問に対するこの回答を参照してください

于 2012-09-06T14:43:38.317 に答える