此语法是否非法
Is this syntax illegal?
以下内容将无法在GCC 4.8.1上编译:
//struct Tag {}; // Program compiles if I use this.
template <typename T>
struct Base {
struct Tag {};
Base(Tag) {}
};
template <typename T>
struct Derived : Base<T> {
Derived(Tag tag) : Base<T>(tag) {}
// Derived(Base<T>::Tag tag) : Base<T>(tag) {}
};
int main() {}
抱怨 [错误] 在"标记"之前应为")"。 不过,它是在Visual Studio 2013上编译的,我想知道VS2013接受它是否正确。 当我在Base<T>
之外声明Tag
时,它确实会编译,但我想在它所属的Base<T>
内部声明Tag
。 使用Derived(Base<T>::Tag tag) : Base<T>(tag) {}
也无济于事。 修复上述问题的任何方法,以便两个编译器都接受这一点,同时Tag
保留在Base<T>
.
[temp.dep]/3:
在类或类模板的定义中,如果基类 取决于模板参数,不检查基类范围 在非限定名称查找期间,或者在定义 类模板或成员,或在类实例化期间 模板或成员。
Tag
用作非限定名 - 因此它永远不能指定 depedent 基类的成员。但是,Tag
也不是依赖的,因此必须在定义时(在实例化之前)解析查找,这使得程序格式不正确。这可以在定义或实例化时进行诊断。
但是,当名称是依赖的(如 Base<T>::Tag
)时,名称查找将被推迟,并在实例化时考虑依赖基类的成员。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 如何找到大小'x'数组是否完全填充,在C++?
- 检查值是否在集合p1和p2中,但不在p3中
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 此模板语法是否非法
- 此语法是否非法
- 获取main()函数的地址是否非法?