Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。

6
可变参数模板包扩展
我正在尝试学习可变参数的模板和功能。我不明白为什么这段代码无法编译: template<typename T> static void bar(T t) {} template<typename... Args> static void foo2(Args... args) { (bar(args)...); } int main() { foo2(1, 2, 3, "3"); return 0; } 当我编译它失败并出现错误: 错误C3520:“ args”:必须在这种情况下扩展参数包 (在功能上foo2)。

9
应该尽可能使用前向声明而不是包含吗?
每当一个类声明仅将另一个类用作指针时,使用一个类正向声明而不是包括头文件是否有意义,以抢先避免循环依赖问题?因此,与其具有: //file C.h #include "A.h" #include "B.h" class C{ A* a; B b; ... }; 改为这样做: //file C.h #include "B.h" class A; class C{ A* a; B b; ... }; //file C.cpp #include "C.h" #include "A.h" ... 有什么理由不这样做吗?


6
在openCV中访问某些像素RGB值
我已经彻底搜索了互联网和stackoverflow,但是没有找到我的问题的答案: 如何在OpenCV中获取/设置(由x,y坐标给出)特定像素的RGB值?重要的是-我用C ++编写,图像存储在cv :: Mat变量中。我知道有一个IplImage()运算符,但据我所知IplImage来自C API,使用起来不太舒服。 是的,我知道OpenCV 2.2线程中已经有了Pixel访问权限,但是它只涉及黑白位图。 编辑: 非常感谢您的所有回答。我看到有很多方法可以获取/设置像素的RGB值。我的密友又给我带来了一个好主意-感谢本尼!这非常简单有效。我认为这是您选择哪种口味的问题。 Mat image; (...) Point3_<uchar>* p = image.ptr<Point3_<uchar> >(y,x); 然后,您可以使用以下命令读取/写入RGB值: p->x //B p->y //G p->z //R
78 c++  opencv 

1
为什么在虚拟继承中调用Default构造函数?
我不明白为什么在下面的代码中,当我实例化一个类型为object的对象时daughter,grandmother()会调用默认构造函数? 我认为grandmother(int)应该调用构造函数(以遵循我的mother类构造函数的规范),或者由于虚拟继承而根本不应该编译此代码。 在这里,编译器grandmother在我的背后默默地调用默认构造函数,而我从未要求过它。 #include <iostream> class grandmother { public: grandmother() { std::cout << "grandmother (default)" << std::endl; } grandmother(int attr) { std::cout << "grandmother: " << attr << std::endl; } }; class mother: virtual public grandmother { public: mother(int attr) : grandmother(attr) { std::cout << "mother: " << attr << …

10
C ++中访问器方法(获取器和设置器)的约定
在SO上已经问了几个有关C ++中访问器方法的问题,但没有一个能满足我对此问题的好奇心。 我尝试尽可能避免访问器,因为像Stroustrup和其他著名的程序员一样,我认为带有很多此类的类是OO不好的标志。在C ++中,在大多数情况下,我可以为类增加更多责任,或使用friend关键字避免此类情况。但是在某些情况下,您确实需要访问特定的班级成员。 有几种可能性: 1.完全不使用访问器 我们可以仅公开各个成员变量。在Java中这是不行的,但对于C ++社区似乎可以。但是,我有点担心要返回一个对象的显式副本或只读(const)引用,是否夸大了? 2.使用Java风格的get / set方法 我不确定它是否完全来自Java,但是我的意思是: int getAmount(); // Returns the amount void setAmount(int amount); // Sets the amount 3.使用客观的C风格的获取/设置方法 这有点奇怪,但显然越来越普遍: int amount(); // Returns the amount void amount(int amount); // Sets the amount 为了使它起作用,您将不得不为您的成员变量找到一个不同的名称。有些人在下划线后面加上下划线,其他人则在前面加上“ m_”。我也不喜欢 您使用哪种风格,为什么?
78 c++  accessor  setter  getter 


6
如何使用CMake检测编译器的C ++ 11支持
是否有一种方法可以让CMake自动检测是否编译器支持C ++ 11? 最好在CMake运行期间通知用户代码将不会编译,因为编译器不支持C ++ 11。目前,我设置了C ++ 11标志。但是,如果编译器不支持它,则用户会在CMake运行期间收到编译错误,而不是错误。 完美的东西就像find_package()。但是,我没有找到任何提供所需功能的模块或功能。 此外,最好具有检测编译器是否需要标志std=c++0x或的功能std=c++11。 是否有可用的东西,或者我需要自己开发? 下面是我到目前为止使用的一些代码,但是它仅适用于GNU'c GCC编译器。如果有一个更通用的解决方案,那将是很好的。 if(CMAKE_COMPILER_IS_GNUCXX) execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) if (GCC_VERSION VERSION_GREATER 4.7 OR GCC_VERSION VERSION_EQUAL 4.7) message(STATUS "C++11 activated.") add_definitions("-std=gnu++11") elseif(GCC_VERSION VERSION_GREATER 4.3 OR GCC_VERSION VERSION_EQUAL 4.3) message(WARNING "C++0x activated. If you get any errors update to a compiler …
78 c++  c++11  cmake 

4
C ++如何将std :: chrono :: time_point转换为long并返回
我需要转换std::chrono::time_point,并从一个long类型(整数64位)。我开始与std::chrono... 这是我的代码: int main () { std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now(); auto epoch = now.time_since_epoch(); auto value = std::chrono::duration_cast<std::chrono::milliseconds>(epoch); long duration = value.count(); std::chrono::duration<long> dur(duration); std::chrono::time_point<std::chrono::system_clock> dt(dur); if (dt != now) std::cout << "Failure." << std::endl; else std::cout << "Success." << std::endl; } 该代码可以编译,但不会显示成功。 为什么与结尾dt不同now? 该代码缺少什么?
78 c++  c++11  chrono 

5
在任何情况下,返回RValue引用(&&)都是有用的吗?
函数应返回RValue引用吗?一种技术,技巧,成语或模式? MyClass&& func( ... ); 我知道一般会返回引用的危险,但是有时候我们还是这样做,不是吗?T& T::operator=(T)只是一个惯用的例子。但是T&& func(...)呢?有没有一般的地方可以从中受益呢?与仅编写客户端代码相比,编写库或API代码时可能有所不同吗?


4
运算符new将内存初始化为零
有这样的代码: #include <iostream> int main(){ unsigned int* wsk2 = new unsigned int(5); std::cout << "wsk2: " << wsk2 << " " << *wsk2 << std::endl; delete wsk2; wsk2 = new unsigned int; std::cout << "wsk2: " << wsk2 << " " << *wsk2 << std::endl; return 0; } 结果: wsk2: …

3
使用命令行选项包括头文件吗?
是否可以在命令行中指定要包含的其他头文件(使用GCC 4 / C ++)? 或者除了#include以外,还有其他方法可以包含文件吗? 背景:我正在尝试在自己的PC上编译大型代码库。该代码通常是在具有复杂构建系统的集群中编译的(SoftRelTools是否有人吗?),该系统与操作系统交织在一起,因此几乎不可能将其安装在其他位置(字面上有数百个makefile和shell脚本,而且很难网络驱动器的编码路径)。但是,实际的代码相当简单,并且可以很好地编译,但是它缺少很多包含(主要是la“ include <vector>”和“ include <math.h>”)。我猜想构建系统通常会解决这个问题,但是我必须遍历代码并手动添加包含,这是我希望避免的。
78 c++  gcc  include 

10
std :: queue迭代
我需要遍历std::queue。www.cplusplus.com说: 默认情况下,如果未为特定队列类指定容器类,则使用标准容器类模板双端队列。 那么我可以以某种方式到达队列的底层双端队列并对其进行迭代吗?

9
在C ++类中初始化静态变量?
我注意到,我在类中的某些函数实际上并未访问该对象,因此我将它们制成了static。然后编译器告诉我,它们访问的所有变量也必须是静态的-到目前为止,还可以理解。我有一堆字符串变量,例如 string RE_ANY = "([^\\n]*)"; string RE_ANY_RELUCTANT = "([^\\n]*?)"; 等等。然后,我将它们全部制成,static const因为它们永不改变。但是,我的程序只有在将它们移出类时才进行编译:否则,MSVC ++ 2010会抱怨“只能在类中初始化静态常数积分变量”。 好吧,这很不幸。有解决方法吗?我想把它们留在他们所属的类中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.