c++ 相关问题

C ++是一种通用编程语言。它最初被设计为C的扩展,并保持类似的语法,但现在是一种完全不同的语言。使用此标记来查询有关使用C ++编译器编译的代码的问题。对特定标准版本[C ++ 11],[C ++ 17]等相关问题使用版本特定标记。

模板中的模板:为什么“`>>”在嵌套模板参数列表中应该是“> >””

我知道当我们在另一个模板中使用模板时,我们应该这样写: 向量 > s; 如果我们把它写成没有空格: 矢量 我知道当我们在另一个模板中使用模板时,我们应该这样写: vector<pair<int,int> > s; 如果我们写的时候没有空格: vector<pair<int,int>> s; 我们会得到一个错误: `>>' 应该是嵌套模板参数列表中的 `> >' 我觉得这是可以理解的,但我就是忍不住想知道,在什么情况下这会是真的模棱两可? 有时您想要它是>>。考虑 boost::array<int, 1024>>2> x; 在 C++03 中,这成功解析并创建了一个大小为 256 的数组。 永远不会有歧义。事实证明,在 C++0x 中,您不必再在关闭模板 > 之间编写空格。 问题是编译器更愿意尽可能独立于上下文对输入进行标记。由于 C++ 无论如何都不是一种上下文无关的语言,因此仅添加这个特殊情况并不会让事情变得特别困难。 在当前标准中,标记化是贪婪的,因此>>将被处理为单个标记,就像a +++ b将被解析为a ++ + b一样。这已经改变并出现了新的标准。虽然它需要编译器实现者做更多的工作,但人们认为总体而言这是值得的(而且一些主要编译器已经将其实现为扩展)。 C++ 确实非常难以解析——比大多数其他语言困难得多。 它是一种非常一致的语言,但是在对输入进行标记和理解语法的语法分析之间做了很多工作,以至于对于编译器来说看起来应该很简单的事情通常并非如此。 历史上的“>>”运算符是运算符。 当源文件被分解为标记时,它被“识别”。 这些标记随后在语法分析期间在某些上下文中被“理解”(标记化完成后很久)。 如果您在标记化时进行了语法分析,那么您就可以“帮助”来帮助区分“>>”应该被视为模板声明(或定义)的两个闭包。 然而,这并不是历史上 C++ 编译器的工作方式。 (新编译器在语法分析和标记化之间进行更多反馈,包括更多“前瞻”以帮助解决这些歧义。) 是的,新的 C++0x 标准改变了这一点,并迫使编译器供应商重新编写其实现,以消除您的情况下的“>>”歧义。 所以,今后的发展,绝不会含糊。 但是,较旧的 C++ 编译器无法处理该问题,因此暂时保持代码与“>”字符之间的空格兼容可能被认为是“良好实践”。 通过设置适当的 C++ 方言来避免此错误。 例如,对于 gcc 4.9,以下文件无法使用 g++ 进行编译: #include <vector> #include <utility> int main() { using namespace std; vector<pair<int, int>> v; // compile error! return 0; } 让我们追根溯源: #include <iostream> int main() { std::cout << __cplusplus << std::endl; return 0; } 仅使用 g++ test.cpp 编译此代码会打印 199711。尽管 gcc 4.9 于 2014 年发布,但默认的 C++ 方言是具有 GNU 扩展的 C++98。 C++98要求我们写vector<pair<int, int> >。如果您更喜欢vector<pair<int, int>>,请使用-std=c++11或-std=gnu++11进行编译。 这取决于编译器。 Visual Studio 不强制要求这样做,即两者都有效,而 g++ 会产生错误。我认为这取决于编译器的实现。 我在用 C++ 编写一个类时遇到了这个问题,我通过执行以下操作解决了这个问题: 产生之前提到的相同错误的行: findAndDrawContoursFrame(cv::Mat&,cv::Mat&,std::vector<std::vector<cv::Point»&); 通过 GCC 交叉编译器并工作的行: findAndDrawContoursFrame(cv::Mat&,cv::Mat&,std::vector< std::vector<cv::Point> >&); 对我来说,这只是对该声明的解释上的错误。 流语法 cin >> var; VS 嵌套模板语法 For<Bar<Barz>> 编译器第一阶段,词法分析器将无法识别。

回答 8 投票 0

为什么这里需要“使用命名空间std”?

我目前使用三个文件:main.cpp、functions.cpp、functions.h。 function.h 文件如下所示: #ifndef 函数_H #定义FUNCIONES_H #包括 #包括 #

回答 1 投票 0

如何从开始和结束迭代器创建范围?

我有一个带有用于获取开始和结束迭代器的函数的对象: const_iterator err_begin() const const_iterator err_end() const 常量 因为它们没有命名为开始和结束,所以我无法通过我的

回答 3 投票 0

创建静态 C++ 库时出现问题

各位程序员大家好!我正在尝试创建一个 C++ 库以在其他项目中使用。该库将是一个静态库,将链接到其他项目。 问题:编译器做...

回答 2 投票 0

GCC 为 boost::shared_ptr 取消引用发出额外的代码

我有以下代码: #包括 struct Foo { int a; }; 静态 int A; 空白 func_shared(const boost::shared_ptr &foo) { A = foo->a; } 空白

回答 1 投票 0

如何确定*真正*导致编译器错误的原因

我正在移植一个非常大的代码库,并且旧代码遇到更多困难。 例如,这会导致编译器错误: 内联 CP_M_ReferenceCounted * FrAssignRef(CP_M_ReferenceCounted * &a...

回答 4 投票 0

类模板成员函数没有“重新定义默认参数错误”?

为什么下面没有编译错误?: // T.h 模板 X 类 { 民众: 无效 foo(int a = 42); }; // 主.cpp #包括“T.h” #包括 模板...

回答 1 投票 0

我会用什么来代替 Javascript 的 '?.' 的 C++ 选项呢?可选链运算符?

在Javascript中,如果我有一个可能为空的对象obj,如果不为空,则该对象将有一个字段x,我可以编写obj?.x。这称为可选链接或安全导航:如果 obj 不是...则不会抛出异常...

回答 1 投票 0

读取 std::string 变量时出现 GDB 错误

#包括 结构S { S(const std::string& es) :first_string(func().c_str()) {} std::string func() { std::string my_string = "某个字符串"; // Breakpo...

回答 1 投票 0

适用于 Android 手机的 Java 编译器

我做了一些谷歌搜索,但没有找到太多关于这个主题的信息,所以我在这里问, 是否有人知道基于手机的 java 或 c/c++ 编译器,以便开发人员可以有效地使用他的手机来开发...

回答 5 投票 0

Poco::DirectoryWatcher 没有 DW_ITEM_MODIFIED 通知

尝试弄清楚如何使用 Poco::DirectoryWatcher。 不幸的是,它并没有像预期的那样工作。 当我将文件添加到监视文件夹时,将调用委托 onFileAdded,然后调用委托 onFileChanged。

回答 1 投票 0

创建共享库时强制解析符号

我正在创建一个共享库(.so),其中包含我的代码以及一些第三方.so。具体来说,第三方 .so 之一是 libaide.so。 链接后,当我执行 nm -DC mylib.so 时,我发现...

回答 1 投票 0

为什么我的数组会打印一些内存垃圾?

这是我的代码: #包括 使用命名空间 std; 类求和器 { 民众: 整数s = 0; 整数数字[10]; 整数总和=0; 无效 sumall() { 计算<< "How many

c++
回答 1 投票 0

C++中如何从另一个类获取成员变量

我想从另一个类获取 public: 成员变量。 但我无法得到它们。你能指导我该怎么做吗? User 和 Computer 类中都有一个 hand 变量。 我想在 d...

回答 1 投票 0

可变参数模板类:允许 float 和 int 参数转换为 float?

我有以下课程: 模板 需要 (sizeof...(Lam) == N) 类谱 { 民众: Spectrum() : 波长{ static_cast(Lam)... } { ...

回答 1 投票 0

Qt Widget 不显示

我创建了一个类,它是用于(仅)绘制图像的 QWidget 的子类,名为 ImageWidget。 当我只创建一个 ImageWidget 并调用 ImageWidget.show() 时,一切都很好。然后我就...

回答 1 投票 0

多个实例中的互斥行为问题

我在尝试运行使用互斥体同步通信的程序的两个实例时遇到问题。当我使用 CreateMutexW 和 bInitialOwner 参数集 t 创建互斥体时...

回答 1 投票 0

为什么有些类型在默认初始化时未初始化,而另一些则没有?

我有点困惑为什么内置类型(如 int)在自动存储期间默认初始化时未初始化,而像 std::string 这样的类则不然。 我读了以下内容

c++
回答 1 投票 0

为什么有些类型在默认初始化时未初始化,而其他类型则不然?

我有点困惑为什么内置类型(如 int)在自动存储持续时间默认初始化时未初始化,而像 std::string 这样的类则不然。我读了以下文章...

c++
回答 1 投票 0

PyBind11 生成 pyd 文件,没有我定义的任何类

我正在使用 Pybind11 包装 C++ 类,以使其可以在 Python 中访问。我的项目涉及一个用Qt6构建的动态库,其中包含一个名为Package的类。我正在写一个包装

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.