限定依赖类型的类型定义
typedef for qualified dependent types
我读了这个关于如何使用C++中的typename关键字的很好的摘要:http://pages.cs.wisc.edu/~driscoll/typename.html
我仍然想知道一个特定的例子:
template<typename T> class Outer{
public:
class Inner1{
T t;
};
class Inner2{
int t;
};
};
template<typename T> void foobar(void)
{
std::list<Outer<T>::Inner1> l;
}
从上面链接的文本中,我明白我需要
std::list<typename Outer<T>::Inner1> l;
因为 Inner1 既是合格的又是依赖的。
但是:Inner2 还需要一个让我感到困惑的字体名称:首先,似乎很清楚Inner2是一种类型(嗯,对于Inner1来说已经很清楚了)。其次,Inner2 根本不依赖于 T。对于所有可能的 Ts,Inner2 将是相同的(类型)!
一旦我在模板中使用限定类型,我是否需要 typedef?是否取决于模板参数?
你的第二个假设是错误的。Inner2 确实依赖于 T,因为每个 Outer 都有另一个 Inner2。如果你专注于 Outer,这一点就很清楚了:
template<> class Outer<char>{
public:
class Inner1{
T t;
};
typedef int Inner2;
};
即使您不专业,Outer<float>::Inner2
和Outer<long>::Inner2
也可能具有相同的布局,成员,名称等,但它们不是同一类型!考虑访问 - Outer<long>::Inner2
可以访问Outer<long>
的私人成员,Outer<float>::Inner2
没有。
在以下专业化中,Inner2甚至不是一种类型:
template<> class Outer<long double>{
public:
char Inner2(int);
};
Outer<T>::Inner2
确实依赖于类型T
,因为编译器不知道Inner2
是什么东西 - 无论是类型还是静态数据成员。 所以是的,你需要通过在这里使用typename
告诉编译器它是什么样的东西,因为默认值是假设它是一个非类型成员(例如静态数据成员、方法名称、enum
值)。
(对于C++03来说也是如此 - 我假设这方面的规则在C++11中没有改变。
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 列表参数的类型定义
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 关于 C++ 中的函数类型定义
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- 将使用/类型定义限制为类范围
- 模板类型定义?
- C++:模板类的类型定义
- 如何对命名空间限定类型进行类型定义?
- 此递归模板类型定义是否有效C++?
- 具有调整对齐方式的类型定义
- C++从抽象类型定义类成员
- 用于C++代码的 API 监视器类型定义 (XML)
- 如何将result_of与函数类型定义一起使用
- 在C++的适当类型定义位置
- 如何根据模板类型定义浮点常量?
- 如何为缺少预定义运算符而不扩展命名空间"std"的标准类型定义运算符>> (istream &, ...)?
- 参数化类的别名(或类型定义)内部类
- 如果我想从类型"T"定义元素的容器(来自 STL),那么"T"必须使用默认构造函数?