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

时间:2014-01-14 16:27:09

标签: c++ gcc

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,但没有任何相关内容突然出现在我身上。)

2 个答案:

答案 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元素,因为它不需要重现)