【发布时间】:2015-01-11 15:27:37
【问题描述】:
以下内容无法在 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() {}
在 'tag' 之前抱怨 [Error] 应为 ')'。虽然它在 Visual Studio 2013 上编译,但我想知道 VS2013 是否正确接受它。当我在Base<T> 之外声明Tag 时它会编译,但我想在它所属的Base<T> 内声明Tag。使用Derived(Base<T>::Tag tag) : Base<T>(tag) {} 也无济于事。解决上述问题的任何方法,以便两个编译器都接受这一点,同时将 Tag 保留在 Base<T> 内。
【问题讨论】:
-
您的代码可以使用 Visual Studio 正常编译。
-
我知道,我说过。但我希望它在两个编译器上都能编译。所以你是说语法是合法的?
-
使用
Derived(typename Base<T>::Tag tag) : Base<T>(tag) {},因为Base<T>是从属名称 -
啊太棒了!谢谢你。问题解决了。但我仍然想知道原始代码是否合法。
标签: c++ templates language-lawyer name-lookup