【问题标题】:template member use in advanced高级模板成员使用
【发布时间】:2014-01-24 21:12:44
【问题描述】:

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

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

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

那些类似的用法,是不是意味着:

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);

   ....
}

【问题讨论】:

  • tempalte 必须是template 你的问题也完全没有My question is:
  • 这就是为什么您必须绝对注意拼写。“定义”只是令人讨厌,但“模板”会导致您的程序无法编译(幸运的是)。
  • 虽然我知道不是每个人都能说流利的英语,但这个问题的措辞确实令人困惑(我没有投反对票,我想我理解了,但这肯定是投反对票的原因)。请花更多时间尝试澄清问题。
  • 使用** 加粗在代码段中不起作用,因为它是常规的 C++ 语法。例如int **ppi, **ppj;
  • 谢谢,下次我会注意并努力提高我的英语水平,让我的问题清晰,不浪费别人的时间。谢谢

标签: c++ templates


【解决方案1】:

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

由于 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 上下文,它是模板实例的类型签名的一部分。这包括更多模板参数的默认值、类模板的基类型以及函数模板的参数和返回类型。

【讨论】:

  • 我认为您的 SFINAE 定义不完整。如果模板引用参数类型的成员,而给定类型没有它,并且针对该类型实例化模板,则编译器会在实例化时发出错误。但是这种实例化只有在考虑了(部分)模板特化和函数重载之后才会发生。
  • @MSalters:你是对的,但这并没有真正描述会导致 SFINAE 和不会导致 SFINAE 的上下文集。如果模板的type在语义上不正确,就会导致SFINAE。如果body不是,则会导致错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
相关资源
最近更新 更多