草庐IT

c++ - 指向成员的指针和指向成员函数的指针之间的VC++ 14模板歧义

我对使用vs14编译器的函数模板有疑问。所以下面的代码演示了这个问题。#includeusingnamespacestd;classClass{public:intmemberFoo(){return0;}};templatevoidnothing(constVariableTC::*memberV){coutvoidnothing(R(C::*memberF)()){cout编译器让我知道nothing函数不明确。当我看到输出时,它的行为似乎超出了我的预期。在第一个nothing函数中,编译器将VariableT推导出为int(void)。其实没那么奇怪,但我想第二个会更合适,会匹配

c++ - 上下文敏感性与歧义

我对上下文敏感性和歧义如何相互影响感到困惑。我认为正确的是:歧义:模棱两可的语法会导致使用左派生或右派生构造多个分析树。所有可能的语法都是模棱两可的语言是模棱两可的语言。例如,C++是一种模棱两可的语言,因为x*y总是可以表示两种不同的东西,如以下所述:Whycan'tC++beparsedwithaLR(1)parser?.上下文敏感性:上下文相关文法具有规则,其中这些规则的左侧可能包含(非)终结符号,除了在不同类型文法的所有规则的lhs中所需的一个非终结符号。这意味着您不能在下降时仅替换非终结符。相反,您必须先查看周围的非终结符。现在困扰我的是那些或多或少说上下文敏感的解析器可以解

c++ - 上下文敏感性与歧义

我对上下文敏感性和歧义如何相互影响感到困惑。我认为正确的是:歧义:模棱两可的语法会导致使用左派生或右派生构造多个分析树。所有可能的语法都是模棱两可的语言是模棱两可的语言。例如,C++是一种模棱两可的语言,因为x*y总是可以表示两种不同的东西,如以下所述:Whycan'tC++beparsedwithaLR(1)parser?.上下文敏感性:上下文相关文法具有规则,其中这些规则的左侧可能包含(非)终结符号,除了在不同类型文法的所有规则的lhs中所需的一个非终结符号。这意味着您不能在下降时仅替换非终结符。相反,您必须先查看周围的非终结符。现在困扰我的是那些或多或少说上下文敏感的解析器可以解

C++文件流打开模式歧义

为了在C++中执行文件IO,我们使用了ofstream、ifstream和fstream类。ofstream:写入文件的流类ifstream:从文件中读取的流类fstream:读写文件的流类将文件与流对象关联的过程称为“打开文件”。打开文件时,我们可以指定打开文件的模式。我的查询与ios::out和ios:in模式有关。当我创建一个ofstream对象并以ios::in模式打开文件时,我能够写入文件,但前提是它已经创建(使用ios::out模式文件,如果它不存在,也会创建它)。但是当我创建ifstream对象并使用ios::out模式打开文件时,我可以从文件中读取。我的问题是为什么当流

C++文件流打开模式歧义

为了在C++中执行文件IO,我们使用了ofstream、ifstream和fstream类。ofstream:写入文件的流类ifstream:从文件中读取的流类fstream:读写文件的流类将文件与流对象关联的过程称为“打开文件”。打开文件时,我们可以指定打开文件的模式。我的查询与ios::out和ios:in模式有关。当我创建一个ofstream对象并以ios::in模式打开文件时,我能够写入文件,但前提是它已经创建(使用ios::out模式文件,如果它不存在,也会创建它)。但是当我创建ifstream对象并使用ios::out模式打开文件时,我可以从文件中读取。我的问题是为什么当流

c++ - 类模板特化优先级/歧义

在尝试依赖可变参数模板实现一些事情时,我偶然发现了一些我无法解释的事情。我将问题归结为以下代码片段:templatestructA{};templateclassZ,typenameT>structtest;templateclassZ,typenameT>structtest>{staticvoidfoo(){std::coutclassZ,typenameT,typename...Args>structtest>{staticvoidfoo(){std::cout>::foo();}在gcc下,它会产生错误,因为它在尝试实例化test>时认为两种特化是同等特化的。:main.cpp

c++ - 类模板特化优先级/歧义

在尝试依赖可变参数模板实现一些事情时,我偶然发现了一些我无法解释的事情。我将问题归结为以下代码片段:templatestructA{};templateclassZ,typenameT>structtest;templateclassZ,typenameT>structtest>{staticvoidfoo(){std::coutclassZ,typenameT,typename...Args>structtest>{staticvoidfoo(){std::cout>::foo();}在gcc下,它会产生错误,因为它在尝试实例化test>时认为两种特化是同等特化的。:main.cpp

C++ 方法调用和类型范围解析歧义

我希望标题确实描述了我想问的......我写了一段代码,用gcc编译并按我的预期工作。但是,它不能用llvm编译,并且用icc编译时代码执行不同!这是一个问题的例子:#includeusingstd::cout;usingstd::endl;classA{public:virtualvoidfoo(){coutbase::foo();}gcc输出:A::foo()icc输出:B::foo()有人能解释一下标准对这个案例的看法吗? 最佳答案 来自C++11,§3.4.5/4:Iftheid-expressioninaclassmemb

C++ 方法调用和类型范围解析歧义

我希望标题确实描述了我想问的......我写了一段代码,用gcc编译并按我的预期工作。但是,它不能用llvm编译,并且用icc编译时代码执行不同!这是一个问题的例子:#includeusingstd::cout;usingstd::endl;classA{public:virtualvoidfoo(){coutbase::foo();}gcc输出:A::foo()icc输出:B::foo()有人能解释一下标准对这个案例的看法吗? 最佳答案 来自C++11,§3.4.5/4:Iftheid-expressioninaclassmemb

c++ - 为什么 B::f 不能解决歧义,但 A::f 可以?

为什么B::f不能解决歧义,但A::f可以?namespaceA{classX{};voidf(X);}namespaceB{voidf(A::X);voidg(A::Xx){usingB::f;//whichexpressionshallIuseheretoselectB::f?f(x);//ambiguousA::forB::f}} 最佳答案 using-declaration充当普通声明:它隐藏外部范围声明,但不抑制参数相关查找(ADL)。当你使用B::f时,你基本上什么都没有改变。您只需在本地范围内重新声明B::f,无论如何