首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套模板type type定义

嵌套模板type type定义
EN

Stack Overflow用户
提问于 2013-03-07 05:23:20
回答 2查看 1.7K关注 0票数 0

我正在尝试编译下面的代码。

文件Class12.h

代码语言:javascript
复制
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

代码语言:javascript
复制
#include "class12.h"

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

然而,我得到了以下错误:

代码语言:javascript
复制
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

有人能帮帮我吗?

非常感谢您提前抽出时间。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-07 05:26:10

编译器非常明确:class1是一个类模板,所以它需要模板参数。你在这里没有:

代码语言:javascript
复制
typedef typename class2<typename class1::Type1> Type3;
          //                           ^ here!

代码语言:javascript
复制
typedef class2<typename class1<T>::Type1> Type3;

其中T可能是T2。请注意,不需要第一个typename

正如您在上一个问题中所述,typedefs应为public

票数 1
EN

Stack Overflow用户

发布于 2013-03-07 05:29:54

在这一行中:

代码语言:javascript
复制
typedef typename class2<typename class1::Type1> Type3;

您没有为class1<>类模板提供任何模板参数。此外,您不需要typename关键字,除非您有一个限定的、相关的名称。你是否拥有一个依赖于你想要实例化class1<>的方式。

此外,如果您希望将class1Method()class2Method()分别作为class1class2的成员函数,则应使用以下语法:

代码语言:javascript
复制
template <class T1>
class class1
{
    typedef T1 Type1;
    void class1Method();
};

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

更新:

编辑后,问题中的代码还有一个问题:class2Method()成员函数中的名称class2引用了函数所属的类,该类是class2的实例化。要引用class2类模板,可以使用其所属的名称空间(在本例中为全局名称空间)限定名称:

代码语言:javascript
复制
typedef typename ::class2<typename class1<T1>::Type1, T2> Type3;
//               ^^

此外,不要忘记为类的成员提供正确的访问级别,否则您将无法从其成员函数外部访问它们:对于classes,缺省值为private。我认为在这种情况下应该使用public。例如:

代码语言:javascript
复制
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();
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15258346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档