小编0x4*_*2D2的帖子

具有对象数组的默认复制行为

如果我有一个数组作为成员的类:

class A
{
    Object array[SIZE];
};
Run Code Online (Sandbox Code Playgroud)

我复制了它的一个实例:

A a;
A b = a;
A c;
c = a;
Run Code Online (Sandbox Code Playgroud)

array逐字节地进行memcpy-ed还是Object::operator=逐个元素复制?

c++ arrays copy-constructor copy-assignment

5
推荐指数
1
解决办法
1316
查看次数

使用匿名模板类型混淆语法?

template <class T, class U> decltype(*(T*)(0) * *(U*)(0)) mul(T x, U y) {
   return x * y;
}
Run Code Online (Sandbox Code Playgroud)

这段代码取自Stroustrup的C++ 11 FAQ.我理解它的作用,它是两个不同类型的对象相乘.令我困惑的是模板参数和函数定义之间的语法.里面发生了什么decltype?我认为它取消引用一个T初始化为0的未命名U指针,并将它与一个未命名的指针相乘,并以相同的方式进行解引用和初始化.我对吗?

好吧,如果这是正在发生的事情,那么指针,解引用和额外括号的使用是不是多余的?我不能在保持预期效果的同时初始化这样的类型吗?:

template <class T, class U> decltype(T(0) * U(0)) mul(T x, U y) {
   return x * y;
}
Run Code Online (Sandbox Code Playgroud)

这对我来说看起来更干净,并且当像第一个那样乘以两个数字时它确实具有相同的效果......

mul(4, 3); // 12
Run Code Online (Sandbox Code Playgroud)

那么为什么Stroustrup坚持使用复杂的指针,解引用和初始化语法?当然,这是在他介绍新auto语法之前.但无论如何,我的问题是:上述两种形式的初始化之间有什么区别吗?他在哪里使用指针并立即取消引用它们而不是简单地做我所做的,这是用没有指针或解除引用来初始化类型?任何回应表示赞赏.

c++ c++11

5
推荐指数
2
解决办法
195
查看次数

使用基类的静态函数而不指定参数以避免歧义

我的一些基类获得了大量的参数.现在我想指定要使用的静态函数:

template <typename... Types>
struct SBase {
    static void func() {
    }
};

struct A : public SBase<int> {
};

struct B : public A, public SBase<int, double, short,
    unsigned int, float, unsigned char, long, unsigned long> {

    // using SBase::func; // Not possible.
    // Horrible, but works.
    using SBase<int, double, short,
    unsigned int, float, unsigned char, long, unsigned long>::func;
};
Run Code Online (Sandbox Code Playgroud)

您可以看到,我需要两次编写模板参数,这会导致代码重复.

有没有办法摆脱它?

c++ class-template c++11

5
推荐指数
1
解决办法
176
查看次数

G++:错误:无法识别的选项“-soname”

我正在尝试在 64 位 Ubuntu 12.04 上构建 SLitrani。我已经从源代码构建了 ROOT 5.34.03,我确实弄清楚了如何为 $ROOTDEV 设置 LD_LIBRARY_PATH 和 PATH 变量,所以问题不存在,但是当我尝试制作 SplineFit 时,我得到了

>>> g++: error: unrecognized option ‘-soname=libSplineFit.so’
make: *** [libSplineFit.so] Error 1
Run Code Online (Sandbox Code Playgroud)

我也没有改变所有-m32-m64在Makefile中,所以我不知道是怎么回事。我能够安装 TwoPad,但无法从 SplineFit 继续。我已经在这个版本上工作了很长一段时间,希望得到任何帮助。

g++

5
推荐指数
1
解决办法
7596
查看次数

基类的基本多态指针

虽然我已经在c ++工作了一段时间,但直到现在我还没有必要使用多态功能,而且我对它们非常感兴趣.

如果我有一个基类ClassA而另一个ClassB派生自它,我理解我可以拥有virtual成员函数ClassA,当实现时ClassB,ClassB即使该实例指向使用ClassA指针,也会在实例中调用它.如果没有这个virtual关键字,我假设基类实现在使用基类指针时会占上风,但是对从子类实例化的对象进行操作,如果事实上ClassB它有自己的相同函数的实现,那对我来说似乎有问题.在这种情况下被有效地忽略了.

这是对多态行为的正确理解吗?

现在真正的问题是你如何引用ClassB指针是基类.我真的只能想到两种方式:

  1. 在实例化时创建指针,使用返回基类指针的函数,同时使用子类的构造函数实际为子类分配内存.(这样的创建函数有一个共同的名称吗?)
  2. 使用static_cast并转换对象并将其指定给指向基类的指针.

这些是生成基类对象的基类指针的两种主要技术吗?

c++ polymorphism

5
推荐指数
1
解决办法
3676
查看次数

致命错误:找不到“stdarg.h”文件

好吧,我刚刚下载了源代码,我确信它是正确的。但是当我使用 make 命令来制作文件后。出现错误:我的笔记本电脑是Mac-air

/usr/include/c++/4.2.1/cstdarg:50:10: fatal error: 'stdarg.h' file not found

有人可以帮我解决这个问题吗?

谢谢

c++ osx-mountain-lion

5
推荐指数
1
解决办法
2万
查看次数

C++ 11 lambda可以捕获文件范围变量吗?

ISO C++ 11规范的第5.1.2节第10节规定:

使用通常的非限定名称查找规则(3.4.1)查找捕获列表中的标识符; 每个这样的查找应该找到一个变量,其自动存储持续时间在本地lambda表达式的到达范围内声明.如果实体(即变量或此实体)出现在lambda表达式的捕获列表中,则称其被明确捕获.

这似乎意味着lambda无法捕获文件范围变量.例如,该程序应该是非法的:

#include <iostream>

int x = 13;

int main()
{
  auto l = [](){ return x; };

  std::cout << l() << std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,g++4.7.1会产生我期望的结果:

$ g++ --version
g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ -std=c++11 lambda.cpp 
$ ./a.out 
13
Run Code Online (Sandbox Code Playgroud)

clang …

c++ lambda c++11

5
推荐指数
1
解决办法
2446
查看次数

方法无法访问同一个类的成员变量(C++)

我写了一个简短的程序来说明我学校项目的继承原则,但我遇到了一个奇怪的问题.这是我的代码:(我省略了所有不是问题的代码)

class Car
{
protected:
    double fuelLevel;
public:
    void fuelUp(double);
};

void fuelUp(double fuel)
{
    Car::fuelLevel += fuel;
}
Run Code Online (Sandbox Code Playgroud)

这是构建日志:

||=== Build: Debug in wierdError (compiler: GNU GCC Compiler) ===|
||In function 'void fuelUp(double)':|
|4|error: 'double Car::fuelLevel' is protected|
|11|error: within this context|
|4|error: invalid use of non-static data member 'Car::fuelLevel'|
|11|error: from this location|
||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
Run Code Online (Sandbox Code Playgroud)

我不知道这个错误意味着什么,我希望有人可以帮助我.

c++ static class protected

5
推荐指数
1
解决办法
1990
查看次数

使用 clang 捕获设置但未使用的参数

有没有办法可以使用类似于 gcc 的 clang 来捕获已设置但未使用的变量Werror=unused-but-set-parameter?我设置了-Wunused但 clang 没有捕获设置但未使用的参数。

c c++ clang

5
推荐指数
1
解决办法
3444
查看次数

C++ std :: stringstream/ostringstream和UTF字符

我正在编写一个处理某些数据的程序,将其输出到.csv文件,然后编写GNUplot脚本,并调用GNUplot来执行脚本并创建一个具有相同名称的图像文件(只有不同​​的扩展名).文件名包含UTF字符(我相信是UTF-8?),例如°,φ和θ.当我使用g ++ 4.4.7在Linux中编译和执行它时,所有这一切都完美无缺.然后我改变了我的代码以在Microsoft Visual Studio 2008中编译,并且在运行程序时问题就开始了.

我使用以下两位代码

  1. 制作标准文件名字符串(我只为其添加各种文件的扩展名)
  2. 打开一个流来写入文件(GNUplot脚本和.csv文件之间的唯一区别是扩展名

    // Generate a file name string
    stringstream ss;
    ss << type << " Graph #" << gID << " - " << title;
    string fileName = ss.str();
    
    // Open a stream for the output file
    ostringstream outfile;
    outfile << fileName << ".gplt" << ends;
    ofstream ofs( outfile.str().c_str() );
    
    Run Code Online (Sandbox Code Playgroud)

写入包含正确UTF字符的ofstream文件的内容ofs,但是stringstream创建的字符串fileNameostringstream创建的文件名(即使没有创建fileName,我测试它)显示字符不正确.

例:

应该是什么 - CDFvsRd图#32 - MWIR @ 300m,无太阳,30kts,θ=全°.csv
最终结果如何 - CDFvsRd图#32 - …

c++ stringstream utf-8 ostringstream ofstream

5
推荐指数
1
解决办法
2076
查看次数