MSVC允许在模板类方法体内使用不完整/未声明的类型?

时间:2015-06-23 00:37:18

标签: c++ templates

我最近重新开放了一年前我工作过的视觉工作室项目,我想让它在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 ++是否有类似的支持?

0 个答案:

没有答案