我最近重新开放了一年前我工作过的视觉工作室项目,我想让它在g ++下编译。在其他问题中,编译器抱怨一些模板代码首先看起来不合法。
具体来说,一些模板类方法实例化了它们的类的迭代器,它们被定义得更低,没有前向声明。如果我不使用模板,这不会是一个问题,因为类声明本身是完全合法的;它是通常在源文件中的方法体,它们会引起问题。似乎模板编译的方式不同,至少在msvc下。
示例代码:
template<class T>
class ClassA : public HasIterator<T>
{
public:
Iterator<T> * GetIterator()
{
return new ClassAIterator<T>(this);
}
};
template<class T>
class ClassAIterator : public Iterator<T>
{
ClassA *foo;
public:
AggregateWrapperIterator(ClassA *foo)
{
//...
}
bool HasNext()
{
//..
}
T Next()
{
//..
}
};
我只是添加前向声明,但由于继承而变得复杂(我有理由首先以这种方式设置它)。
我的问题是:msvc允许这个代码的原因是什么,g ++是否有类似的支持?