以下代码使用 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/