这是有效的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中的一个错误。
作为一个注释,我知道正确的做法是声明类,专门化根,然后定义一般情况,这就是我将对我的代码做的,但我想知道哪个编译器错了?
答案 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的 错误的一种表现形式:缺乏两阶段名称解析。