草庐IT

c++ - 这个函数调用真的有歧义吗?

我正在学习多重继承和菱形问题,当我从最派生类进行函数调用时,VisualStudio告诉我该调用不明确:structA{virtualvoidaFunction(){cout我知道如果我在B类和C类中覆盖了基类函数,那么调用将是不明确的,但是B类和C类中的“aFunction()”不一样吗?此外,让B和C继承自A实际上可以消除错误。但是我对继承时关键字“virtual”的理解,即(Derived:virtualBase)是它阻止链中更下游的“更多派生类”继承链上游Base的多个拷贝。在继承中,可以继承多份成员变量,但只能继承一份同名函数。因此,例如,我可以有5个派生类,每个类都派生自B

c++ - 由于使用声明导致字节和歧义符号?

我们是一个C++库。多年来,我们在全局命名空间中使用typedefunsignedcharbyte;。用户程序和其他库提供了byte的兼容定义,因此没有问题。C++17添加了std::byte并改变了字节的语义。现在我们需要通过避免全局namespace污染来更加卫生;我们需要将自己与std::byte隔离开来。我们的更改是将我们的byte移到我们的命名空间中。在测试更改的影响时,我们目睹了意外的失败。下面的程序没有遵循最佳实践(根据HerbSutter在MigratingtoNamespaces的说法),但我们希望它成为的典型用例用户程序。$cattest2.cxx#include"

c++ - 将 "unsigned char"传递给需要 char 或 const char* 的重载函数会导致歧义

我正在使用QByteArray来存储原始二进制数据。为了存储数据,我使用了QByteArray的附加函数。我喜欢使用无符号字符来表示字节,因为我认为255比-1更容易解释。但是,当我尝试将零值字节附加到QByteArray时,如下所示:command.append((unsignedchar)0x00));编译器提示重载append(unsignedchar)的调用不明确。据我了解,这是因为零可以解释为空指针,但是为什么编译器不将unsignedchar视为char,而不是想知道它是否是constchar*?当然,如果编译器在没有任何转换的情况下提示command.append(0),

构造函数重载中的 C++ 作用域和歧义

我在3种不同的编译器(G++、clang++、CL.exe)中尝试了以下代码片段,它们都向我报告说它们无法消除重载构造函数的歧义。现在,我知道如何修改对构造函数的调用以使其选择一个或另一个(明确表示第二个参数是无符号文字值或显式转换它)。但是,我很好奇为什么编译器会首先尝试在构造函数之间进行选择,因为其中一个构造函数是私有(private)的,并且对构造函数的调用发生在应该在类范围之外的主函数中.谁能教教我?classTest{private:Test(unsignedinta,unsignedint*b){}public:Test(unsignedinta,unsignedintb)

C++ 重载歧义 : conversion versus promotion with primitive types

在这段代码中:voidf(floatf,longinti){cout有一个歧义。Checkitout!.但是,第二个参数是有符号整数。将int绑定(bind)到longint参数需要提升,但对于float,则需要转换。由于第一个参数是关于两个重载的完全匹配,所以它不算数。但是关于第二个参数,它在第一次过载(提升)上的排名优于在第二个(转化)上的排名。为什么会出现解析歧义,而不是选择第一个重载? 最佳答案 int到long是一个转换。short到int是一种提升。(有关积分促销的完整列表,请参阅[conv.prom]。)同理,floa

c++ - 传递 Lambda 时,Visual Studio 2017 中的什么扩展消除了 "bool"与 "std::function"的歧义?

以下代码在VisualStudio2017中使用MSVC编译器编译,但在GCC或Clang中编译失败。#include#includevoidfunctionTest(std::function){std::cout要解决这个问题,我们可以像这样使用enable_if:#include#includevoidfunctionTest(std::function){std::cout::value>::type>voidfunctionTest(BOOL_TYPE){std::cout或者我可以通过引入用户类型而不是bool来消除歧义(如果构造函数存在歧义问题,您需要这样做):#incl

c++ - 资格调整(const/volatile)可能导致歧义

谁能帮我理解为什么当getter是const时下面的代码无法编译(VS2010)?测试代码如下:#includeclasssocket{public://setter-throwexceptionversionvoidnon_blocking(boolmode){//...}//getter-errorcodeversionboolnon_blocking(boost::system::error_code&ec)const{//...}//setter-errorcodeversionvoidnon_blocking(boolmode,boost::system::error_cod

c++ - 消除 std::vector<std::string> 的列表初始化歧义

我的代码中有一个带有类型签名的重载函数:voidfoo(std::string);voidfoo(std::vector);我希望foo的用户能够使用字符串或字符串列表来调用它//Usecase1foo("str");//Usecase2foo({"str1","str2","str3"});foo({"str1","str2","str3","str4"});问题是当调用者将两个字符串传入foo的初始化列表时。//Problem!foo({"str1","str2"});这个对foo的调用是不明确的,因为它匹配两个类型签名。这是因为显然{"str1","str2"}是std::str

c++ 17将string_view与字符串进行比较时的歧义

我看到std::string_view和std::string都有对称的operator==()和std::string它具有接受std::string_view的构造函数和将自身转换为std::string_view的运算符。所以当我们尝试使用operator==()比较std::string_view和std::string时,它是否应该是有歧义的?我想我的想法一定有问题。谁能解释一下?例子:std::strings1="123";std::string_views2="123";//inthefollowingcomparison,wills1usetheconvertopera

c++ - 消除对采用 std::functions 的函数的调用的歧义

下面的代码不能在gcc4.5上编译,因为对foo的调用不明确。消除歧义的正确方法是什么?#include#includeusingnamespacestd;voidfoo(std::functiont){t(1,2);}voidfoo(std::functiont){t(2);}intmain(){foo([](inta,intb){cout 最佳答案 最好的方法是显式创建一个std::function正确类型的对象,然后将该对象传递给函数:std::functionfunc=[](inta,intb){cout或内联:foo(st