草庐IT

c++ - 自定义转换运算符的 Clang 歧义

我一直在开发一种适配器类,当我在clang下遇到问题。当定义了左值引用和右值引用的转换运算符时,您会在尝试从您的类中移出时遇到歧义编译错误(当这样的代码应该没问题时,如operatorconstT&()const&仅允许用于左值AFAIK)。我用简单的例子重现了错误:#includeclassStringDecorator{public:StringDecorator():m_string("Stringdatahere"){}operatorconststd::string&()const&//lvalueonly{returnm_string;}operatorstd::strin

C++语法歧义

考虑:voidf(std::pairterms=std::pair(1,1)){}gcc4.4正常,gcc4.3提示error:expected','or'...'before'>'token。修复是:voidf(std::pairterms=(std::pair(1,1))){}这是什么原因?它是4.3中的错误吗? 最佳答案 这是一个已知问题。它认为第二个逗号分隔参数声明。这是因为在类定义中,函数默认参数首先仅被标记化,然后仅在读取完整的类主体时才被解析。因为它因此并没有真正解析默认参数,所以它没有注意到逗号实际上是模板参数列表中

c++ - 如何消除仅返回类型不同的函数模板的歧义?

我注意到用于区分唯一模板函数的签名与用于区分唯一函数(包括从模板函数实例化的函数)的签名之间存在不对称性。特别是,仅返回类型不同的模板函数被认为是唯一的,而仅返回类型不同的函数被认为是多余的。因此,我有一个相应的问题,即如何在实例化时消除仅返回类型不同的函数模板之间的歧义:#includetemplatelongfoo(T){std::coutcharfoo(T){std::cout在上面的代码中,模板函数foo的实例化是不明确的,正是因为我刚才提到的不对称性。两个模板函数定义的存在是合法的,但是实例化是非法的,即使在同一行代码中指定了返回类型。我问这个问题纯粹是出于理论学习的目的。在

c++ - Vulkan 中的描述符集计数歧义

我想在vulkan中绘制两个对象。为实现这一点,我遵循为每个模型创建两个不同描述符集的过程。但是,我对指定所需描述符集计数的结构感到困惑。令我困惑的点如下:在VkDescriptorSetLayoutBinding指定描述符计数VkDescriptorSetLayoutBindingstagingLayoutBinding={};...stagingLayoutBinding.descriptorCount=1;在VkDescriptorPoolSize指定描述符计数VkDescriptorPoolSizestagingPoolSize={};...stagingPoolSize.de

c++ - 解决 CRTP 函数重载歧义

我有几个函数想用于CRTP基类的派生类。问题是,如果我将派生类传递给用于CRTP类的自由函数,就会出现歧义。一个最小的例子来说明这一点是这个代码:templatestructA{};structC:publicA{};structB{};templatevoidfn(constA&a,constA&b){std::coutvoidfn(constTa,constA&b){std::coutvoidfn(constA&a,constU&b){std::couteverythingworksfineBb;fn(a,a);//failstocompileduetoambiguouscallf

C++:在编译时消除这段代码的歧义?

我试图找到一种方法来消除这段代码的歧义(在编译时)(两天后:-)->get_value是有歧义的。#includetemplatestructtype2type{};templatestructBASE{staticconstexprintget_value(type2type){returnval;}};classX{};classY{};structA:publicBASE,publicBASE{};intmain(intargc,char**argv){Aa{};std::cout{})这是一个有效的运行时解决方案。#includetemplatestructtype2type{

c++ - 为什么私有(private)继承不能解决静态函数的歧义? (在 MSVC 中测试)

我想知道为什么对静态函数的调用是模棱两可的,即使两者之一显然不可能调用,因为它是私有(private)的。我希望我可以使用private/protected继承来帮助编译器解决歧义。它是特定于MSVC还是以某种方式在标准中指定?structA{staticintnum(){return0;}};structB{staticintnum(){return1;}};structC:publicA,privateB{};intmain(){C::num();//Ambiguousaccessofnum}背景是我正在尝试一种通过继承在许多派生类(C、D、E、F、G)中重用重载行为(A中的行为)

C++ 模板歧义

我和一个friend正在讨论C++模板。他问我这应该做什么:#includetemplatestructA{A(bool){std::cout*d=0;constintb=2;constintc=1;newA(c)>(d);}main中的最后一行有两个合理的解析。'b'是模板参数还是b>(c)模板参数?虽然编译它很简单,看看我们得到了什么,但我们想知道是什么解决了歧义? 最佳答案 据我所知,它会被编译为newA(c)>d.这是解析它恕我直言的唯一合理方法。如果解析器在正常情况下不能假定>结束模板参数,那将导致更多的歧义。如果你想要另

c++ - 消除多重继承中的类成员歧义

假设我有这个可rebase类模板:templateclassBase{public://Thememberfoo()canonlybecalledwhenitstemplate//parameteriscontainedwithintheTypes...pack.templatetypenamestd::enable_if::value>::typefoo(){std::coutfoo()成员只有在其模板参数与Base的至少一个参数匹配时才能被调用(Contains的实现列在这篇文章的底部):Base().foo();//fineBase().foo();//error现在我定义了一个

swift - 如何消除同名类型和模块的歧义?

我正在尝试使用KárolyLőrentey的B-treebasedOrderedSet在一个项目中。但是,我遇到了无法声明不合格的问题OrderedSet因为基金会的NSOrderedSet之间的名称冲突(在Swift3中作为OrderedSet导入)和BTree的OrderedSet.letset=OrderedSet()//error:'OrderedSet'isambiguousfortypelookupinthiscontext//Foundthiscandidate:Foundation.OrderedSet:3:14//Foundthiscandidate:BTree.Or