模板成员在高级中使用

时间:2014-01-07 08:51:50

标签: c++ templates

我阅读了一些代码,并参见下面的定义:

你需要查看代码,它只是一个代码段。

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

那些相似的用法,是否意味着:

template <class A>
class AA {
   functionBB(A::C 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);

   ....
}

1 个答案:

答案 0 :(得分:0)

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

由于C ++语法中的含糊不清,模板必须指定依赖于模板参数的标识符是否应该引用类型。所以:

template <class A>
class AA {
    functionBB(A::C c) {}
}

不会在兼容的编译器下编译,因为语法显然希望A::C是一个类型,但不会将其标记为类型。必须在此处使用typename关键字

template <class A>
class AA {
    functionBB(typename A::C c) {}
}

(注意,在上面的较长示例中正确使用了typename)。如果没有typename关键字,则需要引用值。

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

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

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

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