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)
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>&)
不过,GCC 4.8 编译得很好.
我确信这应该有效,我找不到任何不同意我的标准措辞.
这是一个GCC 4.4.1错误,对吗?
(我确实冲过GCC Bugzilla,但没有任何相关内容突然出现在我面前.)
是的,这是一个错误。
\n\n我可以在没有构造函数初始化程序的情况下更简单地重现它:
\n\ntemplate <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 */\nRun Code Online (Sandbox Code Playgroud)\n\n和:
\n\n\n\n\n\n\n
[C++11: 14.6.1/4]:在某些情况下,查找注入类名称(10.2) 可能会导致歧义(例如,如果在多个基类中找到它)。如果找到的所有注入类名称都引用同一类模板的特化,并且该名称用作 template -name,则引用引用类模板本身而不是其特化,并且不是模糊的。[ 例子:Run Code Online (Sandbox Code Playgroud)\n\ntemplate <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\xe2\x80\x94结束示例]
\n
请注意,我的明确用法几乎等同于“OK”。好吧,Derived这里是一个类模板,而不是我的示例中的,所以它不完全是的示例。但现在我很满意 14.6.1 的全部内容使我的代码合法。
事实证明它已被提出为GCC bug 45515 †,但由于它已被固定在头部 ,但由于当时
\n\n†谢谢BoBTFish!
\n