如果 class some_class是模板化的,则以下代码不起作用。 所以我的猜测是我必须将template说明符放在某些东西的前面,但我真的不知道在哪里? 我尝试将它放在变体定义中的 state::base 和 state::error 类型的前面,但这不起作用。 我把它放在哪里,为什么? 演 ...
如果 class some_class是模板化的,则以下代码不起作用。 所以我的猜测是我必须将template说明符放在某些东西的前面,但我真的不知道在哪里? 我尝试将它放在变体定义中的 state::base 和 state::error 类型的前面,但这不起作用。 我把它放在哪里,为什么? 演 ...
该程序无法编译( error: 'foo' is not a member of 'N' ): 但是,如果我们取消注释void foo(); ,它编译。 演示。 两个版本都有错误。 foo即使声明了,也不接受任何参数。 以下问题自提出。 为什么一个版本可以编译,而另一个版本不行? C++ 标准 ...
我编写了这段代码来理解template名称查找: 我有意注释掉了函数bar(int)的声明。 此函数bar(int)在模板函数foo用作dependent name 。 所以它绑定在实例化上。 我在foo之后和foo<int>之前定义了bar ,以便后者可以看到bar(int) ...
下面是标准说有关模板定义非依赖的名字: 模板定义中使用的非依赖名称是使用通常的名称查找找到的,并在使用它们的地方绑定。 [示例1: — 结束示例] 我对h++;的评论感到困惑h++; 上面写着“格式错误:......这可以在此处或在实例化时进行诊断”。 如果实现选择后者, ...
让我们考虑以下演示程序。 正如看见的成员的声明struct B在结构A由数据成员的声明中隐藏B具有类型int 。 所以在模板结构声明的函数定义中 不应该找到依赖名称T::B 。 但是编译器gcc 8.3编译成功,程序输出 另一方面,编译器Visual C++ 2019不会编译程序并发 ...
在类D0 ,变量m需要写成this->m以使其成为将在基类中查找的依赖名称。 但是在D1类中,编译器知道在基类中查找m而不将m写成this->m 。 这怎么可能? 为什么D1类中的m不需要写成this->m ? #include <iostream> #includ ...
此代码在 Clang 和 Visual C++ 上编译良好,但在 GCC 上编译良好: 来自 GCC 的错误消息是 哪一个是对的? ...
这是来自https://devdocs.io/cpp/algorithm/count_if的计数算法的示例实现: 我的问题是, typename iterator_traits<InputIt>::difference_type的意义是什么? 如果我要实现这个,我会简单地使用unsi ...
在 C++ 中,依赖名称的概念很重要,因为: 这样的名称是未绑定的,并在模板实例化点查找......在模板定义的上下文和实例化点的上下文中然而,该标准唯一说的是[temp.dep]/2中给出的依赖名称,指的是不合格的 function 调用,基本上是为了使 ADL 能够对那些 function 调 ...
我有以下代码: 当使用 gcc 9.2 和 clang (9.0) 构建它时,由于调用fun需要template关键字,我收到编译错误。 Clang 显示: 我不明白为什么编译器认为fun是f上下文中的依赖名称,因为f本身不是模板。 如果我将C更改为常规类而不是模板,错误就会消失; 但是, ...
我正在阅读有关模板函数的内容,并对这个问题感到困惑: 如果我不写template void g<double>(double);结果是一样的 . 我认为g<double>应该在f(double)之后实例化,因此在g中对f的调用应该调用f(double) 。 令人惊讶的是,它 ...
我一直在阅读关于删除类型的引用, here 。 它给出了以下示例: std::remove_reference特征中的type s 是依赖类型。 可能的实施 但是为什么它不使用typename std::remove_reference</*TYPE*/>::type呢? ...
cppreference.com 上的这个描述说 模板中使用的依赖名称的查找被推迟,直到模板参数已知,此时 [...] ADL 检查具有外部链接的函数声明,这些函数声明在模板定义上下文或模板实例化上下文中可见。 与此相反,下面的代码片段可以用三个编译器(MSVC、clang、gcc)很好地 ...
从属名称在C ++标准中没有明确定义,因此在确定什么是从属名称方面有很多不足之处,这引出了我这个问题: 具有从属类型的非静态数据成员的不合格名称是否从属? 例如: 这里的名称t是从属名称吗? 该类型当然是依赖的,但尚不清楚名称是否是名称,因为可以始终解析该名称以引用成员。 ...
我编写了以下类,该类具有条件成员_s和worksOnlyForString方法,该方法以std::string访问该成员。 如果没有调用worksOnlyForString方法,则即使成员不是std::string ,代码也会编译。 有一个众所周知的c ++规则-模板函数仅在使用时才完全 ...
考虑这个例子 : 请注意, struct X直到最后才定义。 我曾经相信所有使用过的名字必须在实例化时完成。 但是在这里,编译器如何在定义之前将其视为完整类型? 我已经检查了cppreference中的依赖名称和函数模板实例化的绑定规则和查找规则,但是没有一个能够解释这里发生的 ...
以下非常简单的代码将无法编译 https://godbolt.org/g/zn6UgJ 不会编译我的任何编译器。 而以下 https://godbolt.org/g/o4pc1b 编译得很好,这让我觉得std::vector<T>比较运算符在T的命名 ...
考虑以下: 我想在不指定任何模板参数的情况下引用NonDependent ,如Foo::NonDependent 。 我知道我总是可以使用哑参数: 但这很丑陋,并且由于NonDependent对于T是不变的,所以我想引用它而不依赖于虚拟对象。 可能吗? 谢谢 ...
考虑以下: 没有typename ,编译将失败,因为T2被视为从属名称,因此不是类型。 在考虑了C ++ 17草案标准(N4659)之后,我相信我已经确定了原因: §17.6.2.1第5段 名称是当前实例的成员,如果它是 —一种不合格的名称,当查找时,该名称指的是类 ...
在我的for循环中声明迭代器时研究无符号与有符号整数比较警告时, 我读到了这个 : 尽可能使用您将要比较的确切类型(例如,在与std::string的长度进行比较时使用std::string::size_type )。 我有一个QList<T>我想迭代,使用上面的方 ...