我正在尝试编译下面的代码。
文件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;
}
file 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 :(得分:1)
嗯,编译器很明确:class1
是一个类模板,所以它需要模板参数。你这里没有:
typedef typename class2<typename class1::Type1> Type3;
// ^ here!
你需要一些形式
typedef class2<typename class1<T>::Type1> Type3;
其中T
可能是 T2
。请注意,不需要第一个typename
。
与上一个问题一样,typedefs
应为public
。
答案 1 :(得分:1)
在这一行:
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()
// ^^^^^^^^^^^^
{
}
<强>更新强>
编辑后,问题中的代码还有一个问题:class2
成员函数中的名称class2Method()
是指函数所属的类,它是实例化<{em> of class2
。要引用class2
类模板,您可以使用它所属的命名空间限定名称(在本例中为全局命名空间):
typedef typename ::class2<typename class1<T1>::Type1, T2> Type3;
// ^^
此外,不要忘记为您的班级成员提供正确的访问级别,否则您将无法从其成员函数外部访问它们:对于class
es,默认值为{{1 }}。我认为在这种情况下你应该使用private
。例如:
public