Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板参数,该参数已为;“已知”;_C++_Templates - Fatal编程技术网

C++ C++;模板参数,该参数已为;“已知”;

C++ C++;模板参数,该参数已为;“已知”;,c++,templates,C++,Templates,这个问题可能回答得很好,但不幸的是,我不知道正确的术语来恰当地提问,所以 template <class _Cp, bool _IsConst, typename _Cp::__storage_type = 0> class __bit_iterator; 模板类\uuu位\u迭代器; 有人能解释一下最后一个模板参数吗?我唯一能推断的是,如果为_Cp指定的参数有一个子类型u storage _type,那么在模板中使用_Cp::u storage _type将解决这个问题。如果不

这个问题可能回答得很好,但不幸的是,我不知道正确的术语来恰当地提问,所以

template <class _Cp, bool _IsConst, typename _Cp::__storage_type = 0> class __bit_iterator;
模板类\uuu位\u迭代器;
有人能解释一下最后一个模板参数吗?我唯一能推断的是,如果为_Cp指定的参数有一个子类型u storage _type,那么在模板中使用_Cp::u storage _type将解决这个问题。如果不是,那么这是否意味着_Cp::_存储类型解析为0?这在我看来真的很反常(或者经过一点实验后可能是错误的)

解释与正确的术语和C++的引用是一致的。< /P>


出于兴趣,这段代码来自libc++

类模板
位迭代器
采用三个参数:

  • \u Cp
  • 布尔值
    \u IsConst
  • 类型为
    \u Cp::\u存储类型
    (可能是整数)的对象,没有给出名称
    • 此参数是可选的,默认为表达式
      0
第三个参数的目的(因为它是未命名的,因此不能在
\uu bit\u iterator
的定义中使用)似乎只是要求类
\u Cp
具有与表达式
\uu storage\u type
兼容的成员类型。如果没有,则该实例化(使用该
\u Cp
)无法编译

template <class _Cp, bool _IsConst, typename _Cp::__storage_type = 0> 
class __bit_iterator;
这相当于:

__bit_iterator<X, false, X::__storage_type(0)> bi;
模板
类\位\迭代器;
\u位迭代器
是一个类模板。此模板接受三个参数

  • \u Cp
    ,它是一种类型

  • \u IsConst
    ,它是一个布尔值

  • 最后一个参数未命名,是一个值(就像
    \u IsConst
    )。此参数的类型是在
    \u Cp
    中声明的类型/typedef,并命名为
    \u存储\u Type

  • 如果您对
    typename
    关键字感到困惑:
    typename


    \u Cp
    是模板参数,可以是任何类型。即使是一个类型,它也不包含任何类似于
    \uu存储\u type
    的内容。这就是为什么我们必须告诉编译器,这样的东西应该存在,并且是一个type/typedef。如果未满足此要求,将引发编译时错误

    仅供记录:这看起来像是库代码,不要对任何大写字母
    X
    使用以
    \ux
    开头的名称,也不要在名称
    \ux
    中使用双下划线,因为它们是保留的--与你的问题完全无关:)@DavidRodríguez dribeas他说,这段代码是
    libc++
    @MateuszGrzejek的一部分:大卫说“与你的问题完全无关”。他会留下一封咨询信。谢谢。我缺少的部分是_Cp::_存储类型是一个未命名的参数。有了这些信息,我就可以重新理解模板了(谢天谢地!)。不是我第一次被C++中的匿名类型捕获了!什么是成员类型?这是类中的类型定义吗?或者“类型的成员”,在这种上下文中没有太多意义。@luk32:是的,类中的类型定义。可以是别名(
    使用
    类型定义
    )或嵌套UDT(
    结构
    )。这是一个成员类型,c.f.成员函数,成员变量。@LightningRacisinObrit谢谢我的提问,因为我唯一找到的是2yo+SO问题。我不认为这个术语在任何地方都有定义,即使是作为一个概念,如PODType或琐碎的constructible等。但它在某些场合使用,我想知道是否有一个合适的定义。@luk32:刚刚扫描了标准;找不到。谢谢。我认为这是一个比仅仅要求Cp有一个成员类型存储类型更严格的要求。正如Obrit的RealCraci指出的,它稍微严格一些,它不仅需要这样的类型,而且它可以被分配一个int(用通常的C++隐式转换规则)。通常,只要在模板定义中使用它,就可以保证这样一个子类型的存在。虽然如果你有一个奇怪的类,你需要保证这个类型存在,但从来没有使用过它,那么我想你还需要一些额外的技巧:)谢谢你没有命名的比特顺便说一句。正如闪电Racis在Obrit的答案中所评论的,这就是我错过的技巧!
    __bit_iterator<X, false, X::__storage_type(0)> bi;
    
    __bit_iterator<X, false, 0> bi;
    
    template <class _Cp, bool _IsConst, typename _Cp::__storage_type = 0>
    class __bit_iterator;