在C++模板类中,我能否使用相同的名称来typedef模板参数?

13
如果我有一个模板类:
template<typename Layout>
class LayoutHandler : Handler {
};

我希望将参数"Layout"暴露给该类的用户,因此:

template<typename Layout>
class LayoutHandler : Handler {
public:
    typedef Layout Layout; // using the same name
};

VS2012可以编译此代码并给出预期结果。(我使用std::is_same进行检查。) 这在标准的C++03或C++11中允许吗?


3
我猜这是被允许的,但我不鼓励这样做(感觉不好)。我更喜欢写成 typedef Layout LayoutType; 这样更易读。 - πάντα ῥεῖ
个人而言,我更喜欢为一件事物使用一个名称。在构造函数中,我也会写类似于 T::T(int a): a(a) {} 的代码。 - jingyu9575
typedef 使用相同的名称有什么目的?我不太明白。 - Marson Mao
3
typedef 的目的是使模板参数类型在类外部的代码中可用。 - programmerjake
2个回答

6

C++11不允许这样做。

typedef是一个声明。(见第7.1.3节)

template参数不能在其范围内(包括嵌套范围)重新声明。(见第14.6.1.6节)

C++11草案标准n3242


1

在C+11之前,你不能使用它,否则会出现错误。

‘typedef Layout LayoutHandler::Layout’的声明 错误:模板参数‘class Layout’被遮蔽


1
标准的C++11允许这样吗? - jingyu9575
直到C++11,你不能使用它。我认为它在C++11中也不起作用(至少对我来说是这样)。 - edmz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接