嵌套模板typedef - 类型定义

问题描述:

我想编译下面的代码。嵌套模板typedef - 类型定义

文件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 

有人可以帮我吗?

非常感谢您的时间提前。 谢谢。

+0

唉,标签滥用...你能编辑你的文章吗? – 2013-03-06 21:25:57

+0

@Kerrek SB你是什么意思?现在好吗? :) – geraldCelente 2013-03-06 23:36:39

+0

要格式化您的代码,您必须使用空格或制表符,但不能同时使用两者。如果混合,缩进不会按照你想要的方式出现。它仍然是坏的。 – 2013-03-07 08:45:36

那么,编译器是非常明确的:class1是一个类模板,所以它需要模板参数。您没有任何这里:

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

您需要的形式

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

的一些地方T可能T2。请注意,不需要第一个typename

正如你在上一个问题中,typedefs应该是public

+0

按照你的建议和安迪的我已经更新了相应的结尾。然而,现在我得到错误g ++ -g -c class12.h -o class12.o class12.h:在成员函数'void class2 :: class2Method()': class12.h:25:error :预期的嵌套名称说明符 class12.h:25:错误:预期的init-declarator在“Type3”之前 class12.h:25:error:expected','或';'在“Type3”之前 make:*** [class12.o]错误1 – geraldCelente 2013-03-06 22:22:56

+0

@geraldCelente您是否按照我的建议让typedefs为'public'?此外,它看起来像你正试图将模板代码编译成一个目标文件。你不能那样做。你需要将它包含在用特定类型实例化的代码中,然后编译*那个*代码。 – juanchopanza 2013-03-06 22:27:06

+0

你好,那里。非常感谢你的时间和耐心:)。我已根据您的建议和Andy的更新了代码。但是我不断收到相同的错误。老实说,我不认为这个问题与我的代码中的访问级别有关,在这个例子中,这些类型都是公开的。 – geraldCelente 2013-03-06 23:50:48

在这一行:

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

你不提供对class1<>类模板的任何模板参数。此外,除非有合格的相关名称,否则不需要typename关键字。你是否有一个取决于你想如何实例化class1<>

而且,如果你想拥有class1Method()class2Method()class1成员函数和class2分别,你应该使用这样的语法:

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

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

UPDATE:

编辑后,代码您的问题还有一个问题:class2Method()成员函数中名称class2指的是函数是其成员的类,它是实例class2

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

另外,不要忘了给正确的访问级别:要参考class2模板,你可以用它属于(在这种情况下,全局命名空间)的命名空间限定名称您的课程成员,或者您将无法从其成员功能以外访问它们:对于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(); 
}; 
+0

按照你的建议和juanchopanza的我已经更新了相应的结尾。然而,现在我得到错误g ++ -g -c class12.h -o class12.o class12.h:在成员函数'void class2 :: class2Method()': class12.h:25:error :预期的嵌套名称说明符 class12.h:25:错误:预期的init-declarator在“Type3”之前 class12.h:25:error:expected','或';'在“Type3”之前 make:*** [class12.o]错误1 – geraldCelente 2013-03-06 22:25:20

+0

@geraldCelente:请参阅我的回答更新 – 2013-03-06 22:31:55

+0

您好,那里。非常感谢您的时间和耐心:)。我已根据您的建议和juanchopanza更新了代码。但是我不断收到相同的错误。老实说,我不认为这个问题与我的代码中的访问级别有关,在这个例子中,这些类型都是公开的。 – geraldCelente 2013-03-06 23:42:06