以下使用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?
答案 0 :(得分:2)
在第一个代码段中,Helper不是依赖名称。因为它不依赖,所以必须在解析模板时解析它,而不是在实例化时解析模板。这在C ++ 03和C ++ 0x中都是必需的。
使用typedef使其成为一个依赖名称,因此它在实例化时被解析。您还可以使用typename Test1 :: template Helper&lt; 100&gt;。