继承自专业自我的阶级?

时间:2011-12-07 21:03:34

标签: c++ templates inheritance template-specialization

这是有效的C ++吗?

template<class category>
class any_iterator : public any_iterator<void>
{ 
public:
        typedef any_iterator<void> any_iter_void;

        any_iterator() : any_iter_void() {}
};
template<>
class any_iterator<void>
{ 
public:
        typedef any_iterator<void> any_iter_void;

        any_iterator() {}
        void foo() {};
};

int main() {
    any_iterator<int> a;
    a.foo();
}

MSVC10接受\WALL时没有错误/警告,但gcc-4.5.1抱怨:

  

prog.cpp:3:5:错误:无效使用不完整类型'class any_iterator'
  prog.cpp:2:11:错误:'class any_iterator'的声明
  prog.cpp:在函数'int main()'中:
  prog.cpp:21:11:错误:'class any_iterator'没有名为'foo'的成员   prog.cpp:在构造函数'any_iterator :: any_iterator()[with category = int]':中   prog.cpp:20:27:从这里实例化   prog.cpp:7:44:错误:类型'any_iterator'不是'any_iterator'的直接基础

有人可以引用标准显示这应该或不应该编译吗?我认为这是MSVC中的一个错误。

作为一个注释,我知道正确的做法是声明类,专门化根,然后定义一般情况,这就是我将对我的代码做的,但我想知道哪个编译器错了?

2 个答案:

答案 0 :(得分:4)

要从类型继承,该类型必须完整。一点点重新排列可以解决问题:

template<class category>
class any_iterator;

template<>
class any_iterator<void>
{ 
public:
    typedef any_iterator<void> any_iter_void;

    any_iterator() { }
    void foo() { }
};

template<class category>
class any_iterator : public any_iterator<void>
{ 
public:
    typedef any_iterator<void> any_iter_void;

    any_iterator() : any_iter_void() { }
};

int main()
{
    any_iterator<int> a;
    a.foo();
}

令牌标准引用:

C ++ 11,§10/ 2:

  

base-type-specifier 表示的类型应该是一个不是未完全定义的类的类类型;此类称为正在定义的类的直接基类

9.2节/ 2:

  

类说明符的结束},类被视为完全定义的对象类型(或完整类型)。

答案 1 :(得分:0)

10/2:

  

由基类型指定者表示的类型应该是不完全定义的类的类类型

这是MSVC的 错误的一种表现形式:缺乏两阶段名称解析。