0

以下のコードをコンパイルしようとしています。

ファイル Class12.h

template <class T1>
class class1
{
public:
typedef T1 Type1;
void class1Method();
};

template <class T1>
void class1<T1>::class1Method()
{
}


template <class T1, class T2>
class class2
{
public:
typedef T2 Type2;
void class2Method();
};

template <class T1, class T2>
void class2<T1,T2>::class2Method()
{
  typedef typename::class2<typename class1<T1>::Type1, T2> Type3;
}

ファイル class.h

#include "class12.h"

template<>
class class2<int,double>
{
};

ただし、次のエラーが表示されます。

g++ -g -c class.h -o class.o
In file included from class.h:1:
class12.h: In member function `void class2<T1, T2>::class2Method()':
class12.h:27: error: expected nested-name-specifier
class12.h:27: error: expected init-declarator before "Type3"
class12.h:27: error: expected `,' or `;' before "Type3"
make: *** [class.o] Error 1

誰か助けてくれませんか?

早々にお時間をいただき、誠にありがとうございました。ありがとう。

4

2 に答える 2

1

まあ、コンパイラはかなり明示的です:class1はクラステンプレートなので、テンプレートパラメータが必要です。ここには何もありません:

typedef typename class2<typename class1::Type1> Type3;
          //                           ^ here!

あなたは形の何かが必要です

typedef class2<typename class1<T>::Type1> Type3;

おそらくどこにTありますか。最初のは必要ないことに注意してください。 T2typename

前の質問と同様に、はであるtypedefs必要がありますpublic

于 2013-03-06T21:26:10.267 に答える
1

この行で:

typedef typename class2<typename class1::Type1> Type3;

class1<>クラステンプレートにテンプレート引数を指定しません。typenameさらに、修飾された従属名がない限り、キーワードは必要ありません。持っているかどうかは、インスタンス化する方法によって異なりますclass1<>

さらに、とをそれぞれclass1Method()class2Method()のメンバー関数として使用する場合は、次の構文を使用する必要があります。class1class2

template <class T1>
class class1
{
    typedef T1 Type1;
    void class1Method();
};

template <class T2>
void class1<T2>::class1Method()
//   ^^^^^^^^^^^^
{
}

アップデート:

編集後、質問のコードにはもう1つの問題があります。メンバー関数class2内 の名前class2Method()は、関数がメンバーであるクラスを参照しています。これは、のインスタンス化ですclass2class2クラステンプレートを参照するには、名前をそれが属する名前空間(この場合はグローバル名前空間)で修飾できます。

typedef typename ::class2<typename class1<T1>::Type1, T2> Type3;
//               ^^

また、クラスのメンバーに正しいアクセスレベルを与えることを忘れないでください。そうしないと、メンバー関数の外部からそれらにアクセスできなくなりますclass。esの場合、デフォルトはですprivate。この場合は使うべきだと思いますpublic。例えば:

template <class T1>
class class1
{
public: // <== MAKE THE MEMBERS AND TYPE DEFINITIONS ACCESSIBLE TO 
        //     FUNCTIONS WHICH ARE NOT MEMBER FUNCTIONS OF THIS CLASS
    typedef T1 Type1;
    void class1Method();
};
于 2013-03-06T21:29:54.240 に答える