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;
}

文件类.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大概 哪里T2。请注意,不需要第一个typename.

与您之前的问题一样,typedefs应该是public.

于 2013-03-06T21:26:10.267 回答
1

在这一行:

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

您没有为class1<>类模板提供任何模板参数。typename此外,除非您有一个合格的从属名称,否则您不需要关键字。您是否拥有一个取决于您要如何实例化class1<>.

此外,如果您想将class1Method()andclass2Method()作为 and 的成员函数class1class2您应该使用以下语法:

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

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

更新:

编辑后,您问题中的代码还有一个问题:成员函数class2内部的 名称class2Method()是指函数所属的类,class2. 要引用class2模板,您可以使用它所属的命名空间(在本例中为全局命名空间)来限定名称:

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

另外,不要忘记为类的成员提供正确的访问级别,否则您将无法从其成员函数之外访问它们:对于classes,默认值为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 回答