gcc 4.5.1 与 VC2010 模板部分专业化:哪个符合 C++0x?

Posted

技术标签:

【中文标题】gcc 4.5.1 与 VC2010 模板部分专业化:哪个符合 C++0x?【英文标题】:gcc 4.5.1 vs VC2010 template partial specialization: which is C++0x conformant? 【发布时间】:2011-02-20 08:08:17 【问题描述】:

以下内容使用 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 标准?

【问题讨论】:

无论何时涉及模板,很遗憾 VC++ 不符合标准。这很烦人,但你很快就会掌握它。 【参考方案1】:

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

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

【讨论】:

谢谢。由于我有大约 20 个 TestX 类,每个类都有 10 到 60 个 Helper 成员,因此我寻找简单的声明。猜猜需要一些宏...

以上是关于gcc 4.5.1 与 VC2010 模板部分专业化:哪个符合 C++0x?的主要内容,如果未能解决你的问题,请参考以下文章

gcc 的 C++ 部分模板专业化问题

模板专业化,Windows 与 gcc 上的不同行为?

为啥接受数组的 C++ 模板并不比接受 GCC 5.3 和 Clang 4.0 的指针更专业?

虚拟继承 - gcc 与 vc++

VC++专业版与企业版有啥本质区别? 对于以后的使用哪种更好?更方便?

VC与GCC代码编译差别