以下代码使用 VC2010 编译,但使用 -std=c++0x 的 gcc 4.5.1 失败:

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 标准?

最佳答案

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

使用 typedef 使其成为依赖名称,因此在实例化时解析。您还可以使用 typename Test1::template Helper。

关于c++ - gcc 4.5.1 vs VC2010 模板部分特化 : which is C++0x conformant?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5055949/

10-12 14:49