name-lookup相关内容
在本例中,类Foo和Bar是从库中提供的。我的类Baz从两者继承。 struct Foo { void do_stuff (int, int); }; struct Bar { virtual void do_stuff (float) = 0; }; struct Baz : public Foo, public Bar { void func () {
..
C++20标准草案N4861第节。6.5.1(7)内容: 在类的定义中使用的名称X在 应声明X的完整类上下文...在将其用于 类X或是X的基类的成员... 那么为什么要编译以下代码? #include struct X { X(const int i_) : i(i_) {} int f() const { return 3*g();
..
这个问题是 此线程. 使用以下类定义: 模板类Foo {上市:Foo (const foo_arg_t foo_arg) : _foo_arg(foo_arg){/* 为 foo 做一些事情 */}T Foo_T;//TypeA 或 TypeB - 待定foo_arg_t _foo_arg;};模板类 Bar : public Foo{上市:酒吧 (cons
..
在类中定义的友元函数的完全限定名是什么? 我最近看到了一个类似于以下的示例.下面val()的全称是什么? #include 命名空间 foo {A类{诠释 x;上市:A(int x = 0) : x(x) { }朋友 int val(const A &a) { return a.x;}};}int main() {foo::A a(42);//使用 ADL 找到的 va
..
为什么 C++ 标准为模板定义了两阶段查找?非依赖声明和定义的查找不能也推迟到实例化阶段吗? 解决方案 他们可以.这是最早期的模板实现方式工作,并且仍然是 Microsoft 编译器的工作方式.有人感觉到(在委员会中)这太容易出错了;这太容易了不小心劫持了一个名字,在一个翻译中实例化unit 选择一个本地名称,而不是所需的全局符号.(一个典型的翻译单元将由一系列 #include 组成,声
..
以下代码不能用 gcc 编译,但可以用 Visual Studio 编译: template A类{上市:富;};模板 B类:公共A{上市:void bar() { cout
..
我正在尝试定义仅包含 typedef 的基类. templateA级{上市:typedef std::vectorvec_t;};模板B类:公共A{私人的:vec_t v;//失败 - 无法识别 Vec_t}; 为什么在 B 中我收到一个错误,指出 Vec_t 无法识别,我需要明确地编写它? typename A::Vec_t v; 解决方案 我相信这个问题是重复的,但我现在
..
命名空间 libzerocoin {//承诺类承诺::承诺::承诺(const IntegerGroupParams* p,const Bignum&值):参数(p),内容(值){this->randomness = Bignum::randBignum(params->groupOrder);this->commitmentValue = (params->g.pow_mod(this->con
..
当我调查 Qt 的源代码时,我看到 trolltech 人员明确使用 this 关键字来访问析构函数上的字段. inline ~QScopedPointer(){T *oldD = this->d;清理::清理(旧D);这-> d = 0;} 那么,这种用法有什么意义呢?有什么好处吗? 编辑:对于那些投票结束这个问题的人,我怀疑这种用法是用于某些类继承的情况 QScopedPoin
..
关于什么是参数依赖查找有什么好的解释?许多人也称它为 Koenig Lookup. 最好我想知道: 为什么这是一件好事? 为什么这是件坏事? 它是如何工作的? 解决方案 Koenig Lookup 或 Argument Dependent Lookup,描述了编译器如何在 C++ 中查找非限定名称. C++11 标准 § 3.4.2/1 规定: 当函数调用 (5
..
编译以下代码失败,因为第二个函数找不到第一个函数,即使它在命名空间之外.我自己无法弄清楚问题所在,到目前为止我还没有在网上找到任何答案. test.cpp: #include 结构我的类{};模板 std::ostream&运算符(5, 4);//这是第 13 行.}}int main() {返回0;} 编译器给出的错误(g++ test.
..
考虑以下 C++ 代码示例: 命名空间 n{结构体{};}结构 B {};void foo(int) {}模板无效quux(){脚());}void foo(n::A) {}void foo(B) {}int main(){quux();//错误(但在注释掉 foo(int) 声明时有效)quux ();//作品返回0;} 如注释中所示,模板实例化 quux() 导致编译器错误(在 GCC 4
..
我有一个真实的情况,可以在以下示例中进行总结: 模板 为什么对于编译器来说 B 是一个 TimeListener 并不明显,因此唯一可能的重载解析是 Notifier ? 解决方案 成员名称查找规则说你的代码不明确,因为名称在两个基类中找到,因此查找集无效.您不需要熟悉查找集和合并的所有细节;重要的细节是检查了两个基类并且在两者中都找到了名称 add_listener,这会造成歧义.
..
实际上,此代码在"DEV C ++"中可以正常工作,但是当我将其放入"Hacker-Rank"时,面板上会显示此错误“功能引用不明确",尽管所有在线编译器都显示错误... 我不认为这里的函数重载会在某个地方中断,因为此错误主要来自函数重载. #include#include#include使用命名空间std;int
..
以下包含朋友声明的代码失败,并显示错误消息(请参见 http://ideone.com/Kq5dy ): template无效foo(){}templateA类{无效foo();朋友void foo();//错误:变量或字段'foo'声明为无效};int main(){foo();} 如果朋友声明和成员函数声明的顺序颠倒了,
..
我已阅读[basic.lookup.unqual]的标准部分,对此感到困惑: typedef int f;命名空间N {结构A {朋友作废f(A&);运算符int();无效g(A a){int i = f(a);//f是typedef,而不是Friend函数:等效于int(a)}};} 请考虑以上代码;我不明白为什么名称 f 是类型 int ,而不是 void f(A&).以我的理解,名称
..
此代码可使用MSVC 2015进行编译,但不能使用Clang 5.0.0(trunk 304874)进行编译: template struct Base { T数据; }; 模板 struct衍生:Base { auto getData()const { 返回数据; } };
..
以下代码: struct X { X() {} }; struct Y { Y() {} Y(X) {} Y(int) {} friend bool operator==(const Y&, const Y&) { return false; } }; bool f() { return 1 == X(); } 无法编译,并出现以下错误
..
假设我有一个模板函数: template void tfoo( T t ) { foo( t ); } 后来我想将其与类型一起使用,因此我声明/定义了一个函数并尝试调用它: void foo( int ); int main() { tfoo(1); } 我从g ++中收到错误消息: 在此范围内未声明 'foo',并且在实例化点[-
..
#include int T; int main() { struct T { double x; }; printf("%zu", sizeof(T)); return 0; } 如果我在C中运行此代码,则结果为4,而在C ++中为8. 有人可以解释为什么有区别吗? 解决方案 简短的回答:实际上,因为它们不是相同的标识符.
..