C++ 模板成员在advanced中的使用

C++ 模板成员在advanced中的使用,c++,templates,C++,Templates,我阅读了一些代码,并看到以下定义: 您确实需要查看代码,它只是一个代码段 与我的问题相关的只是我使用**标记,(每次我加粗这个词,总是不生效) 这些类似的用法是否意味着: template <class A> class AA { functionBB(A::C c) {} } 模板 AA级{ 函数BB(A::C){} } 我的问题是: 这是否意味着,当作者定义这样一个模板时,他知道hw将始终使用某个特定类的模板,他知道该类必须有类成员C template<cla

我阅读了一些代码,并看到以下定义:

您确实需要查看代码,它只是一个代码段

与我的问题相关的只是我使用**标记,(每次我加粗这个词,总是不生效)

这些类似的用法是否意味着:

template <class A>
class AA {
   functionBB(A::C c) {}
}
模板
AA级{
函数BB(A::C){}
}
我的问题是: 这是否意味着,当作者定义这样一个模板时,他知道hw将始终使用某个特定类的模板,他知道该类必须有类成员C

  template<class **QueryDataT**>
    class BasicRoutingInterface : boost::noncopyable{
    protected:
        QueryDataT & _queryData;
    public:
        BasicRoutingInterface(QueryDataT & qd) : _queryData(qd) { }
        virtual ~BasicRoutingInterface(){ };

    inline void RoutingStep(typename **QueryDataT::QueryHeap** & _forwardHeap, typename QueryDataT::QueryHeap & _backwardHeap, NodeID *middle, int *_upperbound, const int edgeBasedOffset, const bool forwardDirection) const {
        const NodeID node = _forwardHeap.DeleteMin();
            const int distance = _forwardHeap.GetKey(node);

   ....
}
模板
类BasicRoutingInterface:boost::不可复制{
受保护的:
查询数据和查询数据;
公众:
基本数据接口(查询数据和qd):\u查询数据(qd){}
虚拟~BasicRoutingInterface(){};
内联无效路由步骤(typename**QueryDataT::QueryHeap**&_forwardHeap,typename QueryDataT::QueryHeap&_backwardHeap,NodeID*middle,int*Upper Bound,const int edgeBasedOffset,const bool forwardDirection)常量{
const NodeID node=_forwardHeap.DeleteMin();
const int distance=_forwardHeap.GetKey(节点);
....
}

模板可以引用模板参数的任何成员和任何重载函数(模板参数之外),这些函数期望模板参数作为参数。这些将在模板实例化时解决

由于C++语法中的歧义,模板必须指定是否依赖于模板参数的标识符被期望引用一个类型。

template <class A>
class AA {
    functionBB(A::C c) {}
}
(请注意,
typename
在上面的较长示例中使用正确)。如果没有
typename
关键字,则它应该引用值

当模板引用参数类型的成员而没有这些成员时,可能会发生以下两种情况之一

  • 如果在SFINAE上下文中找不到成员,则忽略模板定义。如果存在模板的另一个定义或非模板重载(对于函数),则使用它们,并且不会发生错误

  • 在任何其他上下文中,编译器将发出错误


一种SFINAE上下文,它是模板实例的类型签名的一部分。它包括进一步模板参数的默认值、类模板的基类型以及函数模板的参数和返回类型。

tempalte
必须是
template
,而且您的问题完全没有
我的问题是:
这就是为什么你必须绝对注意拼写。“定义”只是让人讨厌,但“tempalte”会导致你的程序无法编译(幸运的是)。虽然我知道不是每个人都能流利地使用英语,但这个问题的措辞确实令人困惑(我没有投反对票,我想我理解这一点,但这肯定是投反对票的原因)请多花些时间,试着澄清问题。使用C++代码> *>代码不适用于代码段,因为它是规则的C++语法。例如,代码> int *PPI,*ppJ;< /Cord>谢谢。我会注意到下一次,努力提高我的英语水平,使我的问题清晰而不浪费别人的时间。初始化不完整。如果模板引用某个参数类型的成员,而给定类型没有该成员,并且该模板是针对该类型实例化的,则编译器会在实例化时发出错误。但此实例化仅在(部分)之后发生模板专门化和函数重载已被考虑。@mAlters:您是对的,但这并没有真正描述一组上下文,哪些上下文将导致SFINAE,哪些上下文将不会。如果模板的类型在语义上不正确,则将导致SFINAE。如果正文不正确,则将导致错误。
template <class A>
class AA {
    functionBB(typename A::C c) {}
}