我有一个声明和定义构造函数的基类,但由于某种原因,我公开派生的类没有看到那个构造函数,因此我必须在派生类中显式声明转发构造函数:
class WireCount0 {
protected:
int m;
public:
WireCount0(const int& rhs) { m = rhs; }
};
class WireCount1 : public WireCount0 {};
class WireCount2 : public WireCount0 {
public:
WireCount2(const int& rhs) : WireCount0(rhs) {}
};
int dummy(int argc, char* argv[]) {
WireCount0 wireCount0(100);
WireCount1 wireCount1(100);
WireCount2 wireCount2(100);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我的WireCount1 wireCount1(100)声明被编译器拒绝("没有匹配函数来调用'WireCount1 :: WireCount1(int)'"),而我wireCount0和wireCount2声明都没问题.
我不确定我理解为什么我需要提供显示的显式构造函数WireCount2.是因为编译器为其生成了默认构造函数WireCount1,并且该构造函数隐藏了WireCount0构造函数?
作为参考,编译器是i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5659).
在尝试向某人解释为什么C++静态数组无法动态调整大小时,我发现gcc不同意我的看法.考虑到在编译时不知道数组的维度argc,下面的代码如何编译?
#include <iostream>
int main(int argc, char* argv[]) {
int array[argc];
for(int i = 0; i < argc; i++) array[i] = argv[i][0];
for(int i = 0; i < argc; i++) std::cout << i << ": " << char(array[i]) << std::endl;
//for(int i = 0; i < 100; i++) { std::cout << i << " "; std::cout.flush(); array[i] = 0; }
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我用gcc 4.2.1测试了这个,并且指定了-Wall,而没有从编译器看起来那么脏.如果我取消注释最后一个循环,当我分配给数组[53]时,我得到一个段错误.
我以前放在后卫阵列之前的声明后阵列,并已以零填充他们,肯定的是,程序必须被捣毁它的堆栈的一部分,但GCC重新排序堆栈中的变量,使得我无法观察到任何数据损坏.
显然,我并不是想让这段代码"起作用".我只是想了解为什么gcc甚至认为它可以编译代码.任何提示或解释都将非常感激.
更新:感谢所有人的乐于助人和快速响应!
我是 Visual Studio 的新手,希望禁用 IntelliSense 自动建议而不完全禁用 IntelliSense。更准确地说,我不希望弹出提示不断覆盖我正在处理的代码,但我仍然希望能够使用Ctrl-Space有时请求建议。我正在用 C/C++ 编码。
我已经看到有关如何为 Visual Studio Code 执行此操作的信息,但我还没有找到任何与 Visual Studio 类似的信息。
或者,如果这只是我不了解如何正确使用 Visual Studio 或 IntelliSense 的问题,请帮助我理解或将我指向真正的 Microsoft 爱好者所在的论坛。
在访问者上下文中,我需要在访问子项之前临时设置变量,然后再恢复该变量.我正在使用以下代码,但我确信有更优雅和正确的方法来执行此操作:
template <typename TYPE> class TemporaryAssignment {
protected:
TYPE& mVariable;
TYPE mOriginalValue;
public:
TemporaryAssignment(TYPE& inVariable, TYPE inValue)
: mVariable(inVariable), mOriginalValue(inVariable) {
mVariable = inValue;
}
~TemporaryAssignment(void) {
mVariable = mOriginalValue;
}
};
Run Code Online (Sandbox Code Playgroud)
这允许我写下面的内容:
{
...
TemporaryAssignment<string> t(myVariable, myTemporaryValue);
visitChildren();
...
}
// previous value of myVariable is restored
Run Code Online (Sandbox Code Playgroud)
当临时分配对象超出范围时,该变量将恢复为其先前的值.有什么更好的方法呢?
我的Subversion 1.7.17工作副本对特定文件不满意但无法更新.任何更新尝试都会给我带来同样的错误,即使我删除了文件或删除目录:
Updating 'trunk/src/Makefile':
svn: E155017: Checksum mismatch for '/Volumes/project/dev/torc/trunk/src/Makefile':
expected: 78ee11ff73f3b68c903db838b6667ec3
recorded: 62bbbf4362958e3fd42470650d5b4eb6
Run Code Online (Sandbox Code Playgroud)
我读过SVN - 更新时Checksum不匹配,它的两个主要解决方案是修改.svn/entries或删除和恢复目录..svn/entries在1.7下的顶级文件中没有任何用处,删除和恢复目录并没有解决我的问题.有人有其他建议吗?
c++ ×3
arrays ×1
autosuggest ×1
checksum ×1
constructor ×1
default ×1
dynamic ×1
intellisense ×1
mismatch ×1
static ×1
svn ×1