我知道编译器通常是代码中错误的最后一个责任,但我没有看到对以下 C++ 代码的以下行为的任何其他解释(从实际项目中提炼出来):
#include <iostream>
#include <map>
int main()
{
auto values = { 1, 3, 5 };
std::map<int, int> valMap;
for (auto const & val : values) {
std::cout << "before assignment: valMap.size() = " << valMap.size();
valMap[val] = valMap.size();
std::cout << " -> set valMap[" << val << "] to " << valMap[val] << "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
该代码的预期输出是:
before assignment: valMap.size() = 0 -> set valMap[1] to 0
before assignment: valMap.size() = 1 -> set valMap[3] to 1 …Run Code Online (Sandbox Code Playgroud) 我正在使用C++的C库(libgretl),它的一些函数与我的代码冲突,所以我想将它包装在一个命名空间中,如下所示:
namespace libgretl {
extern "C" {
#include <gretl/libgretl.h>
}}
Run Code Online (Sandbox Code Playgroud)
但是,这不能编译,我从gcc文件中获得"未定义"错误(在Windows上使用mingw32和gcc 4.5.2).第一个错误来自文件c ++/cstddef的以下代码块:
_GLIBCXX_BEGIN_NAMESPACE(std)
using ::ptrdiff_t;
using ::size_t;
_GLIBCXX_END_NAMESPACE
Run Code Online (Sandbox Code Playgroud)
宏分别扩展到namespace std {和}.之后会有更多错误.
省略该extern "C"指令没有帮助.使用匿名命名空间可以减少错误数量,但仍然无法编译.
因此,我的问题是,是否有某种方法可以包含这样的C库并将其功能放入命名空间,而无需更改gcc或库的源文件?
谢谢.
米哈尔
我遇到了使用mingw的异常的奇怪问题,并设法将其剪切为以下示例:
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
void test(int a) {
if (a < 0) {
throw std::ios_base::failure("a < 0");
}
}
void test_file(std::string const & fName)
{
std::ifstream inF(fName.c_str(), std::fstream::in);
if (!inF) {
cout << "file error -> throwing exception" << endl;
throw ios_base::failure("could not open input file '" + fName + "'");
}
}
int main()
{
try { test(-5); }
catch(std::exception& e) {
cerr << "Exception caught: " << e.what() << " .. continue …Run Code Online (Sandbox Code Playgroud) 在 C++ 中,如果我有一个带有可赋值元素的类/结构,我通常不会提供赋值运算符。但是,还可以选择使用C& operator=(C const&) = default;(在头文件中)将其定义为默认值。
除了显式定义可以使运算符私有或受保护这一事实之外,这两种方法之间是否有任何区别?
对于可以省略或设置为 的其他元素(default例如(复制)构造函数)来说,这是否相同?
我没有hg pull和hg update在那里我有未提交更改的文件夹上.它为几个文件打开了三向比较/合并工具,但我关闭了它们,因为我不记得更改是比回购中的更新还是更新 - 我认为这会使文件冲突就像它在SVN中所做的那样..但不是,所有文件都合并了:
更新到分支默认更新了
25个文件,合并了0个文件,删除了0个文件,未解析了0个文件
不幸的是,合并以不起作用的方式混合了两个版本.
因此,我的问题是,是否有办法撤消合并并取回本地文件(带有未经修改的更改),就像我之前调用它们一样hg update?
(我发现这篇帖子,一位评论者建议hg resolve --tool internal:local,但在我的案例中似乎没有做任何事情.)
谢谢.
我通过为每个节点创建一个类来建模一般的树结构,其中包含指向父节点,第一个子节点和第一个兄弟节点的指针,以及指向最后一个兄弟节点的指针(不需要但很有用).对此,我正在添加一些额外的数据atd.我目前的实施是:
class TreeNode {
typedef boost::shared_ptr<TreeNode> Ptr;
typedef boost::weak_ptr<TreeNode> WPtr;
WPtr p2parent; ///< pointer to the parent node (NULL in the root)
Ptr p2sibling; ///< pointer to the first sibling (or NULL)
Ptr p2child; ///< pointer to the first child (or NULL)
WPtr p2lastChild; ///< pointer to the last child (not strictly needed)
};
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我正在使用shared_ptr用于兄弟和子节点,因此只需删除其根目录即可删除整个树.对于指向parent的指针,我知道我不应该使用shared_ptr,因为这会创建循环,所以我必须在weak_ptr和原始指针(TreeNode*)之间做出选择 - 任何想法?
对于指向最后一个子节点的(可选)指针,选择在weak_ptr,shared_ptr和原始指针之间 - 什么是使整个类内部一致的最佳选择?
最后,我在结构上有几个迭代器,比如深度优先迭代器atd.迭代器应该在内部使用什么指针:raw pointer,weak_ptr或shared_ptr?这三种方法有哪些优点?