gcc 4.5.1 vs VC2010模板部分特化:哪个符合C ++ 0x?

时间:2011-02-20 08:08:18

标签: c++ visual-studio-2010 templates gcc c++11

以下使用VC2010进行编译,但使用gcc 4.5.1并使用 -std = c ++ 0x 进行编译:

template <class T, class TBase>
class TestBase : public TBase
{
public:
// Helper functor
    template <unsigned int t_u, class TRet = int>
    struct Helper
    {
        TRet operator() (int x = 0, int y = 0)
        {
                return (TRet)t_u;
        }
    };
}; // class TestBase

template<class TBase>
class Test0 : public TestBase<Test0<TBase>, TBase>
{
public:
    Helper<100> Get100; // gcc 4.5.1 error: 'Helper' does not name a type
};

gcc接受更详细的信息:

template<class TBase>
class Test1 : public TestBase<Test1<TBase>, TBase>
{
    typedef TestBase<Test1<TBase>, TBase> thisBase;
public:
    typename thisBase::template Helper<100> Get100;
};

哪个(如果有的话)符合c ++ 0x?

1 个答案:

答案 0 :(得分:2)

在第一个代码段中,Helper不是依赖名称。因为它不依赖,所以必须在解析模板时解析它,而不是在实例化时解析模板。这在C ++ 03和C ++ 0x中都是必需的。

使用typedef使其成为一个依赖名称,因此它在实例化时被解析。您还可以使用typename Test1 :: template Helper&lt; 100&gt;。