-
24 votesanswersviews
static_assert依赖于非类型模板参数(gcc和clang上的不同行为)
template <int answer> struct Hitchhiker { static_assert(sizeof(answer) != sizeof(answer), "Invalid answer"); }; template <> struct Hitchhiker<42> {}; 尝试使用 static_assert... -
950 votesanswersviews
我必须在何处以及为何要使用“模板”和“typename”关键字?
在模板中,我在哪里以及为什么必须在依赖名称上放置 typename 和 template ?究竟什么是依赖名称?我有以下代码: template <typename T, typename Tail> // Tail will be a UnionNode too. struct UnionNode : public Tail { // ... template<... -
952 votesanswersviews
我必须在何处以及为何要使用“模板”和“typename”关键字?
在模板中,我在哪里以及为什么必须在依赖名称上放置 typename 和 template ?究竟什么是依赖名称?我有以下代码: template <typename T, typename Tail> // Tail will be a UnionNode too. struct UnionNode : public Tail { // ... template<... -
7 votesanswersviews
具有依赖qualified-id的class-member using-declaration应该是依赖名吗?
C 11标准的N3337草案于 [namespace.udecl] 中声明 using声明在声明区域中引入了一个名称,其中出现using声明 . 每个using声明都是声明和成员声明,因此可以在类定义中使用 . 在用作成员声明的using声明中,嵌套名称说明符应命名要定义的类的基类 . 这通常用于在派生类的基类public中创建受保护的typedef,如下例所示,它在最新版本的Clang中成功... -
952 votesanswersviews
我必须在何处以及为何要使用“模板”和“typename”关键字?
在模板中,我在哪里以及为什么必须在依赖名称上放置 typename 和 template ?究竟什么是依赖名称?我有以下代码: template <typename T, typename Tail> // Tail will be a UnionNode too. struct UnionNode : public Tail { // ... template<... -
952 votesanswersviews
我必须在何处以及为何要使用“模板”和“typename”关键字?
在模板中,我必须在哪里以及为什么要在依赖名称上放置 typename 和 template ?究竟什么是依赖名称?我有以下代码: template <typename T, typename Tail> // Tail will be a UnionNode too. struct UnionNode : public Tail { // ... template<... -
3 votesanswersviews
再次使用typename和template关键字
我已经仔细阅读了很多关于这个主题的答案,但是在非模板函数(嵌套模板类的成员)的范围内,当这两个关键字不需要这些关键字时,我无法弄清楚 . 我的参考编译器是GNU g 4.9.2和clang 3.5.0 . 它们在下面的代码中几乎没有什么不同,我把嵌入式注释试图解释会发生什么 . #include <iostream> // a simple template class with a... -
10 votesanswersviews
从依赖基类访问类型
有谁知道为什么使用声明似乎不适用于从依赖基类导入类型名称?它们适用于成员变量和函数,但至少在GCC 4.3中,它们似乎被忽略了类型 . template <class T> struct Base { typedef T value_type; }; template <class T> struct Derived : Base<T> { // Ve... -
15 votesanswersviews
允许`this->`访问依赖基类成员的规则是什么?
我们知道,下面的代码格式错误,因为成员 x 在依赖的基类中 . 但是,在指示的行上将 x 更改为 this->x 将修复错误 . template <typename T> struct B { int x; }; template <typename T> struct C : B<T> { void f() { int ... -
11 votesanswersviews
为什么`this`是一个依赖于类型的表达式,即使模板类没有基类?
可以编译以下代码而不会出现错误: template <typename T> struct A { void f() { this->whatever; } // whatever is not declared before }; int main() { A<int> a; } 我知道这是因为 this 是一个依赖于类型的表达式,它使 whate... -
2 votesanswersviews
嵌套类是类模板中的依赖类型?
考虑以下: template<class> struct T { struct T1 { struct T2 { }; }; /*typename*/ T1::T2 m; }; 如果没有 typename ,编译将失败,因为T2被视为依赖名称,因此不是类型 . 在查看C 17标准草案(N4659)之后,...