GCC 4.4.1拒绝在ctor-initializer中找到我的注入类名:
template <typename T> struct Base { Base(int x) {} }; struct Derived : Base<int> { Derived() : Base(2) {} }; int main() { Derived d; }
06001
但GCC 4.8 compiles it just fine.
我确信这应该有用,我找不到任何不同意我的标准措辞.
这是一个GCC 4.4.1错误,对吗?
解决方法
是的,这是一个错误.
如果没有ctor-initialiser,我可以更简单地重现它:
template <typename T> struct Base { }; struct Derived : Base<int> { Base* ptr; }; int main() { Derived d; } /** * in GCC 4.4.1: * * error: ISO C++ forbids declaration of "Base" with no type */
和:
[C++11: 14.6.1/4]:
A lookup that finds an injected-class-name (10.2) can result in an ambiguity in certain cases (for example,if it is found in more than one base class). If all of the injected-class-names that are found refer to specializations of the same class template,and if the name is used as a template-name,the reference refers to the class template itself and not a specialization thereof,and is not ambiguous. [ Example:06001
—end example ]
请注意,我的明确用法几乎等同于“OK”.好吧,所以Derived是一个类模板,而不是我的例子,所以它不是完全相同的例子.但我现在感到满意的是,整个14.6.1使我的代码合法化.
事实证明它已被提升为GCC bug 45515†,但由于它当时已被固定在头上,因此它的细节很少.
†感谢BoBTFish!