当我把它推入一个向量时,我正在使用其他人的课程.它涉及一个成员变量,它是对另一个成员变量的引用.这是最小的自包含示例:
#include <iostream>
#include <vector>
class Myclass {
public:
Myclass() : a(1.0) {}
float a;
float &a_ref = a;
void addOne() {
a = a + 1.0;
}
};
int main() {
Myclass instance1;
instance1.addOne();
//prints 2:
std::cout << "instance.a_ref is " << instance1.a_ref << std::endl;
std::vector<Myclass> vec;
Myclass instance2;
vec.push_back(instance2);
vec.at(0).addOne();
//prints 1;
std::cout << "vec.at(0).a_ref is " << vec.at(0).a_ref << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我是用汇编g++和-std=c++11,所以我没有注意到一会儿这个问题.我现在看到问题可能与合成的复制构造函数和引用成员有关.但我不确定的是:
g++使用c ++ 11标准给出任何警告?奖金问题,因为我很好奇:
a …我想在 makefile 中定义一个变量,它应该是项目中所有文件依赖项的列表,用一个空格分隔。我这样做是:
DEP_LIST = $(shell g++ -M $(SRC_FILES) $(INC_DIRS))
Run Code Online (Sandbox Code Playgroud)
它输出我的所有项目依赖项,例如:
main.o: src/main.cpp /usr/include/stdc-predef.h /usr/include/c++/4.8/iostream /usr/include/x86_64-linux-gnu/c++/4.8/bits/c++config.h ...
Run Code Online (Sandbox Code Playgroud)
我过滤掉这些xxx.o:位
DEP_LIST_FILTERED = $(filter-out %.o:, $(DEP_LIST))
Run Code Online (Sandbox Code Playgroud)
现在输出
src/main.cpp /usr/include/stdc-predef.h /usr/include/c++/4.8/iostream /usr/include/x86_64-linux-gnu/c++/4.8/bits/c++config.h ...
Run Code Online (Sandbox Code Playgroud)
到目前为止看起来不错,现在我只需要使用以下方法去除双空格:
DEP_LIST_STRIPPED = $(strip $(DEP_LIST_FILTERED))
Run Code Online (Sandbox Code Playgroud)
但这没有任何效果,输出与之前的相同。大概这与我的 shell (bash) 处理空格的方式有关,但我找不到任何有关它的信息。有任何想法吗?
编辑:如果相关,我需要删除双空格的原因是我想将列表传递给表单中的 ctags
ctags $(DEP_LIST_STRIPPED) -{options}
Run Code Online (Sandbox Code Playgroud)
但在目前的形式中,它抱怨:
ctags: Warning: cannot open source file " /usr/include/c++/4.8/iostream" : No such file or directory
Run Code Online (Sandbox Code Playgroud) 我不认为有人设法为Windows 64位构建gtkmm 3,或者知道一个好的构建?
谷歌有大约3-4个链接,人们已经尝试过,但由于各种原因,我无法让他们中的任何一个工作.pkg-config文件丢失了(所以我无法编译任何程序),或者我收到incompatible .dll.a样式错误消息,或者程序崩溃了.
我自己尝试构建它并失败,因为我认为我没有足够的经验,我尝试在gtkmm邮件列表上询问,没有人回复.有官方的win64安装程序,但仅适用于gtkmm 2.
我对全局常量有点困惑.我(初学者级别)的理解是'全局'变量是在块之外定义的并且具有程序范围(来源:http://www.learncpp.com/cpp-tutorial/42-global-variables/).但该计划:
#include <iostream>
const double x=1.5;
int main(){
std::cout << "1) x=" << x << std::endl;
double x=2.5;
std::cout << "2) x=" << x << std::endl;
//const double x=3.5;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用-Wall编译g ++(GCC,最新的64位版本),没有任何问题.
输出:
1) x=1.5
2) x=2.5
Run Code Online (Sandbox Code Playgroud)
这对我来说很困惑.第一个cout评估的事实意味着main将'x'识别为'全局'变量(它未在main的范围中定义).如果是这样的话,为什么让我重新定义'x'?
然后,如果取消注释注释的第三个声明,g ++会引发重新声明错误.意思是,我的第一个宣言不能是'全球',在我定义的意义上:S
编辑:好的,问题与全局变量无关,但是范围:例如http://pastebin.com/raw.php?i=V5xni19M中的相同问题