草庐IT

ranged-based

全部标签

c++ - 沮丧 : why: ‘A’ is an inaccessible base of ‘B’ ?

与此错误消息的其他示例不同,我已经有一个指向A的指针并且想要检索实际的子类。这种安排是一些C++包装的C代码的一部分A是一些PODC结构(whatswhy没有动态转换)而test是C中的一些回调调用C++功能并检索应使用强制转换的正确对象。但是为了防止C++用户代码弄乱C-Baseclass,我希望继承protected。MSVC不会提示这个但g++会提示!?从标准的角度来看,哪一个是正确的?为什么?#includeusingnamespacestd;//plainCstructurestructA{inti;};//someC++WrapperclassstructB:protect

c++ - clang 的 'range-loop-analysis' 诊断是关于什么的?

背景:考虑以下example:#include#includeintmain(){std::vectorvectorBool{false,true};for(constauto&element:vectorBool)std::cout它发出警告:test.cpp:6:21:warning:loopvariable'element'isalwaysacopybecausetherangeoftype'std::vector'doesnotreturnareference[-Wrange-loop-analysis]for(constauto&element:vectorBool)std:

java - C++ 和 Java : Use of virtual base class

在比较C++和Java的多重继承时,我有些疑惑。即使Java通过接口(interface)使用多重、多级继承-但为什么它不像C++那样使用虚拟基类?是不是因为java接口(interface)的成员被确保在内存中有一个拷贝(它们是publicstaticfinal),并且方法只被声明而没有被定义?C++虚类除了节省内存还有其他用途吗?如果我忘记在我的多重继承程序中使用此功能,是否有任何注意事项?这有点哲理-但为什么C++开发人员不默认将每个基类设为虚拟?提供灵active的必要性是什么?示例将不胜感激。谢谢!! 最佳答案 1)Jav

c++ - 将 std::ios_base::trunc 标志与 std::ios_base::out 一起使用的目的是什么

在std::ios_base::out中使用std::ios_base::trunc标志的目的是什么?我在很多例子中都看到了这一点。我认为标准保证std::ios_base::out也会截断文件(我知道的所有STL实现都这样做)。我错了吗,应该明确通知我要截断文件吗? 最佳答案 是的,std::ios_base::out等同于fopen中的"w"。std::ios_base::trunc的重点是std::ios_base::in和std::ios_base::out同时使用。在|out等同于"r+"在|出来|trunc等同于"w+"

c++ - 为什么 is_base_of 都只是普通的 char 类型时会失败

你明白为什么static_assert失败了吗:templatevoidfoo(constT&c){static_assert(std::is_base_of::value,"Tmustbechar");//Fails!}intmain(){charc='a';foo(c);return0;}我交换了T和“char”,仍然失败。 最佳答案 您可能需要考虑添加额外的检查:templatevoidfoo(constT&c){static_assert(std::is_base_of::value||std::is_same::value

c++ - operator const Base&() 是否应该用于不可访问的基类?

我希望有一个类允许访问其基本情况的const接口(interface),但不允许访问其他类。特别是:classB{};classA:privateclassB{public:operatorconstB&(){return*this;}};intmain(){Aa;constB&b=a;//Shouldthislinebeanerror?}g++给出了一个不可访问的基类错误。你们那里的语言专家认为这个错误在C++11/C++14中是正确的吗?是的,我意识到我可以(并且将会)这样做:intmain(){Aa;constB&b=a.operatorconstB&();}对这个构造的另一种方

c++ - 为什么 ranges::ostream_iterator 是默认可构造的?

这个问题遵循评论中的讨论here.在EricNiebler的ranges-v3library中(这有点成为C++20标准的一部分),ranges::ostream_iterator是default-constructible-没有ostream。怎么会?我认为后来有效构造的“虚拟”构造是C++中的反模式,我们正在逐渐摆脱这种缺陷。std::ostream迭代器canonlybeconstructedwithastream(目前-在C++20之前)。似乎我们可以用默认构造的range::ostream_iterator做任何事情...所以,这是怎么回事? 最佳

c++ - 编程 : Principles and Practice Using C++ chapter 4 drill step 6 : General question about numeric range

我想提示用户输入一些double值,然后存储最小值和最大值,然后打印文本。这是我到目前为止的代码:#include#include#include#includeusingnamespacestd;intmain(){doublemin=1000000000;//Hereismyissue!doublemax=-100000000;//Hereismyissue!for(doubleinput;cin>>input;){if(input=='|')return0;elseif(inputmax){max=input;cout所以我的代码工作正常并且做我想做的,但我对处理双最小值和最大值

c++ - 添加虚拟删除错误 : type 'base' is not a direct base of derived class

考虑以下示例代码:#includeusingnamespacestd;classbase{public:base(){cout这给出了错误:error:type`base'isnotadirectbaseof`derived2'为什么会出现这个错误?如果我将基类设为虚拟,则错误不再存在。这是什么原因? 最佳答案 因为base不是derived2的直接基类。您必须为您的直接基础提供构造函数,在本例中为derived1。虚拟基地除外。它们总是在叶类中初始化,否则您可能会为同一个基类调用多个构造函数。因此,如果您使base成为虚拟的,您不

c++ - 为什么我不能将指向 Derived 类成员函数的指针强制转换为相同但属于 Base 类的成员函数?

对我来说,将void(Derived::*)()转换为void(Base::*)()看起来非常安全,如下所示代码:#include#includeusingnamespacestd;structBase{void(Base::*any_method)();voidcall_it(){(this->*any_method)();}};structDerived:publicBase{voida_method(){cout但是编译器在a.any_method=&Derived::a_method;处提示转换。这是防止细微编程错误的障碍,还是只是为了让编译器编写者的生活更轻松?是否有变通方法