我最近将gcc和g ++更新到版本7.2.我想尝试一下std::experimental::any,std::variant特别是,我在QtCreator中使用Qt 5.9.1.
到目前为止,我已经在项目文件中写了这个:
CONFIG += c++17
Run Code Online (Sandbox Code Playgroud)
我在正确的位置添加了正确的标题:
#include <variant>
#include <experimental/any>
Run Code Online (Sandbox Code Playgroud)
任何工作都很好,没有问题.但是,当我包含变体头文件时,我收到此错误:
/usr/include/c++/7/bits/c++17_warning.h:32: error: #error This file requires compiler and library support for the ISO C++ 2017 standard. This support must be enabled with the -std=c++17 or -std=gnu++17 compiler options.
Run Code Online (Sandbox Code Playgroud)
#error此文件需要编译器和库支持\ ^ ~~~~
我在项目文件中尝试过各种各样的东西,这里是完整列表:
CONFIG += c++17
Run Code Online (Sandbox Code Playgroud)
&
CONFIG += c++1z
Run Code Online (Sandbox Code Playgroud)
&
QMAKE_CXXFLAGS += -std=c++17
Run Code Online (Sandbox Code Playgroud)
&
QMAKE_CXXFLAGS += -std=c++1z
Run Code Online (Sandbox Code Playgroud)
&
CONFIG += c++17
QMAKE_CXXFLAGS += -std=c++17
Run Code Online (Sandbox Code Playgroud)
&
CONFIG += c++1z
QMAKE_CXXFLAGS += -std=c++1z
Run Code Online (Sandbox Code Playgroud)
&
CONFIG …Run Code Online (Sandbox Code Playgroud) 不久前我遇到了问题,让 std::variant 在 QtCreator 项目中工作,在这里面临类似的抱怨:
无法在 QtCreator 中使用 g++ 7.2 使用 c++17 功能
我解决了这个问题,并且已经愉快地在这个项目上工作了一段时间,没有出现进一步的问题。它在 ubuntu 14.04 上运行,使用 GCC 7.2.0 构建,并在 clang 5.0 下构建。
两天前,我备份了所有内容,安装了最新的 QtCreator,再次安装了我的所有工具(gcc 7.2.0 和 clang 5.0),检索了我的项目并尝试构建。构建失败,说明:
/usr/include/c++/7.2.0/bits/c++17_warning.h:32: 错误:此文件需要编译器和库支持 ISO C++ 2017 标准。必须使用 -std=c++17 或 -std=gnu++17 编译器选项启用此支持。
在我的项目文件中,我已经有了这个:
QMAKE_CXXFLAGS += -std=c++17
Run Code Online (Sandbox Code Playgroud)
我可以在编译器输出中的短语“-std=c++17”中看到。这是直到出现第一个错误为止的完整编译器输出:
15:08:37: Running steps for project AIRadioQt...
15:08:37: Skipping disabled step qmake.
15:08:37: Starting: "/usr/bin/make"
/home/pete/Programming/Qt/5.10.0/gcc_64/bin/qmake -o Makefile ../AIRadioQt/AIRadioQt.pro -spec linux-clang CONFIG+=debug CONFIG+=qml_debug
clang++ -c -pipe -std=c++17 -g -std=gnu++11 -Wall -W -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_QML_DEBUG -DQT_DATAVISUALIZATION_LIB -DQT_WIDGETS_LIB …Run Code Online (Sandbox Code Playgroud) 我正在使用QtCreator,Qt 5.10,并尝试在一个完美运行的项目中使用c ++ 17,直到我干净安装最新的Ubuntu并重新安装所有内容.
现在,当调用clang来构建项目时(由于某种原因,我的Clang Relase,Clang Debug和GCC Debug构建......)我从.pro文件中添加了这个额外的编译器标志:
-std=gnu++11
Run Code Online (Sandbox Code Playgroud)
使用我的GCC Release kit(实际调用gcc编译器而不是clang)进行构建时,不会发生这种情况.这个额外的标志覆盖了早期的标志:
-std=c++17
Run Code Online (Sandbox Code Playgroud)
...因为.pro文件中的行而添加:
QMAKE_CXXFLAGS += -std=c++17
Run Code Online (Sandbox Code Playgroud)
我查看了每个构建的makefile,这里是Clang Release构建的Makefile:
#############################################################################
# Makefile for building: AIRadioQt
# Generated by qmake (3.1) (Qt 5.10.0)
# Project: ../AIRadioQt/AIRadioQt.pro
# Template: app
# Command: /home/pete/Programming/Qt/5.10.0/gcc_64/bin/qmake -o Makefile ../AIRadioQt/AIRadioQt.pro -spec linux-clang
#############################################################################
MAKEFILE = Makefile
####### Compiler, tools and options
CC = clang
CXX = clang++
DEFINES = -DQT_DEPRECATED_WARNINGS -DQT_NO_DEBUG -DQT_DATAVISUALIZATION_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB
CFLAGS = -pipe -O2 -Wall -W -D_REENTRANT -fPIC $(DEFINES)
CXXFLAGS = …Run Code Online (Sandbox Code Playgroud) 只是一些愚蠢的想法,但如果计算机能够有效地计算256位算术,比如他们有256位架构,我想我们可以取消浮点.我也想知道,如果有任何理由要超越256位架构?我的基础是相当脆弱的,但我相信如果我错了你就会把我直截了当;)这是我的想法:
您可以使用256位类型,使用127或128位作为整数,使用127或128位作为小数值,然后使用符号位.如果您的硬件能够计算,存储和移动这些大数字而没有任何问题,我认为您将设置为处理您遇到的任何计算.
一个例子:如果您使用长度,并且您以米为单位表示所有值,则最小值(2 ^ -128米)将小于普朗克长度,最大值(2 ^ 127米)将更大比可观察宇宙的直径.想象一下,计算精度小于普朗克长度的光年数?
好吧,这只是一个例子,但我很难想到任何可能保证数量大于小的情况.有什么想法吗?我没有考虑定点运算是否存在问题?创建256位架构是否存在问题?
floating-point precision performance fixed-point cpu-architecture
我确定这个问题已经在某些地方得到了解答,请将它链接到它,如果有的话,但我很难找到这个确切问题的答案.有许多非常接近.以下是我已经阅读过的一些内容并不能完全回答我的问题:
使用指针传递引用和值 在C++中通过引用传递 指针的原因?对作为函数参数传递的指针使用delete
以下是该情况的基本概述,试图使其非常接近我的实际用法:
void func (vector<int>* foo) {
int bar = foo->at(0);
// transform bar
foo->at(0) = bar;
// Should I delete foo?
delete foo;
}
int main() {
vector<int> data (4, 0);
data.at(0) = 5;
for (int i = 0; i > 10; i++) {
func(&data);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:上面的for循环应该是这样的:
for (int i = 0; i < 10; i++) {
Run Code Online (Sandbox Code Playgroud)
因此,正如您所看到的,我创建了一个名为data的向量,然后将数据引用传递给该函数.该函数通过引用从数据中获取值,对其进行转换,然后通过引用再次将新值保存回数据.
在此特定方案中,此函数是唯一接收此数据的函数,但它会被重复调用,并且每次都会将引用传递给相同的数据.
我的主要问题是,我应该在该函数的末尾删除foo吗?此外,如果我还有一个额外的功能也传递了对数据的引用,那会改变答案吗?
我已经阅读了其他一些问题,建议小心删除函数中的指针,但它们都与首先声明为指针的数据类型有关.我首先没有声明一个指针或引用,只是创建一个引用作为函数的参数(我想?).
我之所以这样问的原因是我的程序有一些严重的内存泄漏.我已经做了一些研究,并阅读了许多关于指针相关的内存泄漏,我发现这可能是它的一个来源
我试过在一个这样的函数的末尾添加一个"删除",到目前为止一切似乎都很好......但是我不想添加一大堆删除,然后一段时间在路上发现它是一个非常糟糕的主意:D
提前干杯,皮特
我一直在进入我希望能够制作单一功能以涵盖类似任务的情况.
编辑:
记住的任务是比较对象之间的成员变量.如果有一种方法可以编写一个允许您将对象作为参数提供的函数,并将特定成员变量作为另一个参数进行比较,那将是非常好的.这将需要某种方式来表示或识别我想要在函数的每次调用中比较的特定成员变量.
这是一个示例类和对象来说明我的意思:
class MyObject {
int var1;
int var2;
int var3;
// Unwritten constructor that sets all member variables in order
};
MyObject obj1 (1, 2, 3);
MyObject obj2 (4, 3, 2);
Run Code Online (Sandbox Code Playgroud)
下面是一组类似函数的示例,这些函数可以合并为一个函数,动态选择使用哪个成员变量:
int compareMemberVar1 (MyObject obj1, MyObject obj2) {
return max(obj1.var1, obj2.var1);
}
int compareMemberVar2 (MyObject obj1, MyObject obj2) {
return max(obj1.var2, obj2.var2);
}
int compareMemberVar3 (MyObject obj1, MyObject obj2) {
return max(obj1.var3, obj2.var3);
}
Run Code Online (Sandbox Code Playgroud)
这些可以像这样使用:
int var1max = compareMemberVar1 (obj1, obj2);
int var2max = compareMemberVar2 (obj1, …Run Code Online (Sandbox Code Playgroud) 我还在学习python的基础知识,我花了一段时间阅读有关如何从for循环中删除python中列表中的项目的方法.我读过的所有内容都表明了这样做的复杂方法,他们说你在迭代它时不能从列表中删除项目.但是......这似乎有效:
class Object():
def __init__(self):
self.y = 0
object_list = [Object(), Object(), Object()]
for thing in object_list:
thing.y += 1
if thing.y > 10:
object_list.remove(thing)
Run Code Online (Sandbox Code Playgroud)
当其他人说它不是并且编写复杂的解决方法时,为什么这会起作用?是因为你不允许在Python 2中使用它,但可以在Python 3中执行吗?
这是正确的方法吗?它会像我想要的那样工作还是容易出错?如果我计划删除项目,是否建议以相反的顺序迭代列表?
很抱歉,如果之前已经回答过这个问题,但是很难知道哪些资源引用了什么,因为他们只是在标签中说"python"(至少,我一直在阅读的那些,也许那是因为我读过的所有资源)是python 2?)
谢谢!
编辑:
对不起,有几个复制和粘贴错误...我已修复它们......
编辑:
我一直在观看Raymond Hettinger的另一个视频......他提到了一种从字典中删除项目的方法,同时使用dict.keys()进行迭代.就像是:
d = {'text': 'moreText', 'other': 'otherText', 'blah': 'moreBlah'}
for k in d.keys():
if k.startswith('o'):
del d[k]
Run Code Online (Sandbox Code Playgroud)
显然使用键可以在迭代时删除项目.列表是否有等价物?如果有,我可以在列表上向后迭代并安全地删除项目
c++ ×4
c++17 ×3
qt-creator ×3
clang ×2
variant ×2
compare ×1
fixed-point ×1
for-loop ×1
function ×1
list ×1
makefile ×1
member ×1
object ×1
performance ×1
pointers ×1
precision ×1
python ×1
python-3.x ×1
qmake ×1