GCC 4.4.1错误是因为不接受ctor-initializer中的注入类名?

Lig*_*ica 7 c++ gcc

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;
}
Run Code Online (Sandbox Code Playgroud)
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>&)
Run Code Online (Sandbox Code Playgroud)

不过,GCC 4.8 编译得很好.

我确信这应该有效,我找不到任何不同意我的标准措辞.

这是一个GCC 4.4.1错误,对吗?

(我确实冲过GCC Bugzilla,但没有任何相关内容突然出现在我面前.)

Lig*_*ica 4

是的,这是一个错误。

\n\n

我可以在没有构造函数初始化程序的情况下更简单地重现它:

\n\n
template <typename T>\nstruct Base\n{\n};\n\nstruct Derived : Base<int>\n{\n    Base* ptr;\n};\n\nint main()\n{\n    Derived d;\n}\n\n/**\n * in GCC 4.4.1:\n * \n * error: ISO C++ forbids declaration of "Base" with no type\n */\n
Run Code Online (Sandbox Code Playgroud)\n\n

和:

\n\n
\n

[C++11: 14.6.1/4]:在某些情况下,查找注入类名称(10.2) 可能会导致歧义(例如,如果在多个基类中找到它)。如果找到的所有注入类名称都引用同一类模板的特化,并且该名称用作 template -name,则引用引用类模板本身而不是其特化,并且不是模糊的。[ 例子:

\n\n
template <class T> struct Base { };\ntemplate <class T> struct Derived: Base<int>, Base<char> {\n   typename Derived::Base b;            // error: ambiguous\n   typename Derived::Base<double> d;    // OK\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\x94结束示例]

\n
\n\n

请注意,我的明确用法几乎等同于“OK”。好吧,Derived这里是一个类模板,而不是我的示例中的,所以它不完全是的示例。但现在我很满意 14.6.1 的全部内容使我的代码合法。

\n\n

事实证明它已被提出为GCC bug 45515 †,但由于它已被固定在头部 ,但由于当时

\n\n

†谢谢BoBTFish!

\n