Possible Duplicate:
Using template parameters as template parameters




这是一些高度模板化的容器类的代码片段,用于绑定任意数量的任意类型的字段。我的一位同事发现我的代码未在GCC下编译,经过大量研究,他找到了通过添加::template使其正确推断出模板的解决方案...我们之前从未见过,现在仍然除了GCC不需要Visual Studio 2010的我的代码外,我真的不知道这是什么。

    template< typename T, int N >
    struct SingleBindMemberStruct
    {
        typedef typename TGenericBindingHandler<T>::BindToUse BindType;
        BindType m_Member;

        template< typename ContainerClass >
        static void AddBinding(CPackedTableDataSpec* spec)
        {
// Perhaps with newer versions of the compilers we can find a syntax that both accept. This is with gcc-4.5 and Visual Studio 2010
#if defined(__GNUC__)
            TGenericBindingHandler<T>::template AddBinding<ContainerClass>(spec, N, &ContainerClass::template SingleBindMemberStruct<T,N>::m_Member);
#else
            TGenericBindingHandler<T>::template AddBinding<ContainerClass>(spec, N, &ContainerClass::SingleBindMemberStruct<T,N>::m_Member);
#endif
        }
    };


有人在语法上知道::template可以或应该用于什么吗?如果有人从描述它的标准中摘录了片段,那将是完美的!

编辑:

听起来不错,实际上就像帮助编译器确定什么是模板一样简单,并且由于这是一个static函数,我们使用范围解析运算符而不是点运算符来告诉编译器该模板。因此,现在唯一剩下的问题是为什么Visual Studio也不需要它?

最佳答案

它告诉编译器AddBinding是模板-由于AddBinding的定义取决于T,因此在编译过程的正确阶段编译器不会知道这一点(我不是专家详细信息,但这与C ++编译模型AFAIK有关)。通过在template之后编写::,可以为编译器提供原本没有的信息。我猜更具体地说,当它在<之后看到<时,它知道它是在处理模板而不是AddBinding运算符。

如果您想获得更详细的答案,则可能需要查看C ++模板:完整指南。 (如果您搜索Google,我认为它可以PDF格式提供。)

10-06 16:03
查看更多