GCC 4.4.1拒绝在 ctor-initializer 中找到 inject-class-name :
template <typename T>
struct Base
{
Base(int x) {}
};
struct Derived : Base<int>
{
Derived() : Base(2) {}
};
int main()
{
Derived d;
}
test2.cpp: In constructor "Derived::Derived()": test2.cpp:9: error: class "Derived" does not have any field named "Base" test2.cpp:9: error: no matching function for call to "Base<int>::Base()" test2.cpp:4: note: candidates are: Base<T>::Base(int) [with T = int] test2.cpp:3: note: Base<int>::Base(const Base<int>&)
GCC 4.8 compiles it just fine,但是。
我确信这应该有用,我找不到任何不同意我的标准措辞。
这是GCC 4.4.1错误,对吗?
(我确实在搜索GCC Bugzilla,但没有任何相关内容突然出现在我身上。)
答案 0 :(得分:4)
是的,是一个错误。
如果没有 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]:
查找 inject-name-name (10.2)的查找在某些情况下会导致歧义(例如,如果在多个基类中找到它) )。如果找到的所有注入类名称引用同一类模板的特化,并且如果该名称用作模板名称,则引用引用类模板本身而不是它的专业化,并不含糊。 [例如:template <class T> struct Base { }; template <class T> struct Derived: Base<int>, Base<char> { typename Derived::Base b; // error: ambiguous typename Derived::Base<double> d; // OK };
-end example]
请注意,我的明确用法几乎等同于“OK”。好吧,所以Derived
是一个类模板,而不是我的例子,所以它不是相当相同的例子。但我现在感到满意的是,整个14.6.1使我的代码合法化。
原来它已被提升为GCC bug 45515 †,但由于它已经在 head 上被修复,因此它的细节很少。
†感谢BoBTFish!
答案 1 :(得分:0)
使用: Base<int>(2) {}
(编辑:抱歉,我只是拿走了CRTP元素,因为它不需要重现)