小编Mat*_*ton的帖子

谷歌可以用智能指针返回类型模拟一个方法吗?

我有一个返回智能指针的工厂.无论我使用什么智能指针,我都无法让Google Mock嘲笑工厂方法.

模拟对象是纯抽象接口的实现,其中所有方法都是虚拟的.我有一个原型:

MOCK_METHOD0(Create, std::unique_ptr<IMyObjectThing>());
Run Code Online (Sandbox Code Playgroud)

我得到:

"...gmock/gmock-spec-builders.h(1314): error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'"
Run Code Online (Sandbox Code Playgroud)

定义了智能指针中指向的类型.

我得到它试图访问一个声明私有的构造函数,但我不明白为什么.当这是一个std :: auto_ptr时,错误说没有复制构造函数,这让我很困惑.

无论如何,有没有办法模拟一个返回智能指针的方法?或者有更好的方法来建造工厂吗?我唯一的决心是返回一个原始指针(blech ......)?

我的环境是Visual Studio 2010 Ultimate和Windows 7.我没有使用CLI.

c++ unit-testing smart-pointers googlemock

46
推荐指数
3
解决办法
2万
查看次数

正则表达式:匹配,但不在评论中

我有一个数据字段文件,可能包含注释,如下所示:

id, data, data, data
101 a, b, c
102 d, e, f
103 g, h, i // has to do with 101 a, b, c
104 j, k, l
//105 m, n, o
// 106 p, q, r
Run Code Online (Sandbox Code Playgroud)

正如您在上面的第一条评论中所看到的,可以直接引用匹配模式.现在,我想捕获103和它的三个数据字段,但我不想捕获评论中的内容.

我已经尝试过消极的lookbehind来排除105和106,但我无法想出一个正则表达式来捕获它们.

(?<!//)(\b\d+\b),\s(data),\s(data),\s(data)
Run Code Online (Sandbox Code Playgroud)

这将捕获所有但不包括105的捕获,但要指定

(?<!//\s*) or (?<!//.*)
Run Code Online (Sandbox Code Playgroud)

因为我试图用任何空格或任何字符排除评论会使我的整个正则表达式无效.

我有一种感觉,我需要一个狡猾的锚点使用,或者我需要在捕获组中包装我想要的东西并$1在我的lookbehind中引用它(比如).


如果这是"正则表达式不支持递归"的另一种情况,因为它是一种常规语言(自动机理论),请指出.

是否可以使用正则表达式排除103和第105和106行中的注释?如果是这样,怎么样?

regex comments

8
推荐指数
1
解决办法
7920
查看次数

由于其他依赖库,在VS2010中链接googleTest会导致LNK2005

我有一个庞大而复杂的项目,最终得到了单元测试.我已经在Visual Studio 2010本地构建了googleTest 1.6.0,使用cmake构建的项目文件就像README指定的那样.

该项目有许多静态和动态链接的依赖库.其中许多是专有的.所有链接尝试都会产生220个这样的错误.这是一个抽样:

msvcprtd.lib(MSVCP100D.dll):错误LNK2005:"public:void __cdecl std :: _ Container_base12 :: _ Orphan_all(void)"(?_ Olphan_all @ _Container_base12 @std @@ QEAAXXZ)已在gtest.lib中定义(gtest-all. OBJ)

libcpmtd.lib(cerr.obj):错误LNK2005:"protected:char*__cdecl std :: basic_streambuf> :: _ Gndec(void)"(?_ Gndec @?$ basic_streambuf @ DU?$ char_traits @ D @ std @@@ std @@ IEAAPEADXZ)已在msvcprtd.lib中定义(MSVCP100D.dll)

LIBCMTD.lib(setlocal.obj):错误LNK2005:已在MSVCRTD.lib中定义_configthreadlocale(MSVCR100D.dll)

链接:警告LNK4098:defaultlib'MSVCRTD'与使用其他库冲突; use/NODEFAULTLIB:library LINK:警告LNK4098:defaultlib'LIBCMTD'与使用其他库冲突; 使用/ NODEFAULTLIB:库

致命错误LNK1169:找到一个或多个多重定义的符号

我已经尝试了/ NODEFAULTLIB标志,并且我试图忽略msvcprtd.lib,MSVCRTD.lib和LIBCMTD.lib,如建议的那样,但后来我遇到了未解决的符号......

项目和googleTest都使用x64,/ MP,/ MDd和no/clr进行编译.

我一直在玩编译器标志,想知道是否存在某种版本不匹配.在我理解的范围内,Dumpbin没有暗示我可能理解的任何东西.我希望有一个呃

linker-errors googletest visual-studio-2010 lnk2005

7
推荐指数
1
解决办法
6455
查看次数

什么时候不应该使用 [[carries_dependency]]?

我发现了一些问题(比如这个)问什么[[carries_dependency]]是,这不是我在这里问的。

我想知道你什么时候不应该使用它,因为我读过的所有答案都让人觉得你可以把这段代码贴在任何地方,而且你会神奇地得到相等或更快的代码。一个评论说代码可以相等或更慢,但海报没有详细说明。

我想在任何函数返回或参数上使用 this 的合适位置是指针或引用,并且将在调用线程内传递或返回,并且不应在回调或线程入口点上使用它。

有人可以评论我的理解并详细说明一般的主题,何时以及何时不使用它?

编辑:我知道这个主题有这本书,如果其他读者感兴趣的话;它可能包含我的答案,但我还没有机会通读它。

c++ multithreading memory-model carries-dependency stdatomic

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

如何在Java中搜索与谓词匹配的键的映射?

我能正确理解吗?这是Java开发人员如何做到的?或者,还有更好的方法?

因此,如果我想在地图中找到与谓词匹配的键,我必须首先通过方便提供的方法从地图中获取键集.那么,我必须通过方便提供的方法将集合转换为流.那么,我必须通过方便提供的方法用我的谓词过滤流.然后,我必须通过方便提供的方法将流转换为我选择的类型的容器,可能提供收集器.那么,我至少可以检查容器是否为空,以便知道是否有任何匹配.只有这样我才能使用密钥来提取感兴趣的值,或者我可以从头开始使用条目集,并为自己节省额外的步骤.

是这样的,真的吗?因为据我所知,没有其他方法可以内置到地图中,也可以作为通用搜索算法提供给迭代器或其他容器抽象.

java java-8

4
推荐指数
2
解决办法
3628
查看次数

std :: vector是否有转换运算符?我在看什么?

Windows 7上的Visual Studio 2010 Ultimate.

编辑:这是一个非常古老的代码,我没有写,一个很大的老混乱,深深植根于代码库.这不是很快就会改变的.虽然,我很高兴你们都确认了我的想法:这本身应该是不可能的.

我有equivelant代码:

typedef std::vector<Widget*> widget_vector_t;

typedef struct
{
    widget_vector_t widget_array_[SOME_SIZE_CONSTANT];
} WIDGET_STRUCT;
Run Code Online (Sandbox Code Playgroud)

然后,在一个类中,我有一个WIDGET_STRUCT成员:

WIDGET_STRUCT widgets_;
Run Code Online (Sandbox Code Playgroud)

在一些成员方法的正文中,我看到了......这...... :

Widget *p = widgets_.widget_array_[SOME_INDEX_CONSTANT];
Run Code Online (Sandbox Code Playgroud)

为了清楚起见,我的理解是这是将Widget指针的向量分配给Widget指针.

它有效.

STL向量是否提供了一些强制转换操作符或返回向量中第一个元素的东西

c++ stl vector

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

这个带有元组的递归引用是否安全?

我正在试验并写下这个怪物:

class my_tuple : public std::tuple < std::vector<my_tuple> > {};
Run Code Online (Sandbox Code Playgroud)

它似乎可以编译并实际工作.我发现它很狡猾,因为以下内容无法编译:

using my_other_tuple = std::tuple < std::vector<my_other_tuple> > ;
Run Code Online (Sandbox Code Playgroud)

最终,我试图解决为什么my_tuple有效以及是否存在潜在的可怕后果.我正在努力学习元组是什么以及我能用/应该用它们做些什么.因此,如果有人愿意对此发表评论,请提供一些非常好的见解,我将不胜感激.

Windows 7和VS 2013.

c++ c++11 visual-studio-2013

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

通过值认为参数是const

Windows 7 64位上的Visual Studio Enterprise 2010 sp1.提升1.48.0.

这里开始相关代码.这些位在标题中定义.

//typedef struct {} empty_t;
//typedef std::pair<size_t, std::shared_ptr<char>> string_t; //Don't ask...
//typedef boost::variant<empty_t, long, double, some other PODs, string_t> variant_t;
//typedef std::map<unsigned short, variant_t> variant_map_t;
Run Code Online (Sandbox Code Playgroud)

这是在复制构造函数的主体中:

std::for_each(std::begin(incoming.values_), std::end(incoming.values_), [&](variant_map_t::value_type value)
{
    // This guy is going to populate this::values_, doing the right thing -
    // copying by value native and POD types, or deep copying pointers.
    boost::apply_visitor(deep_copy_visitor(*this, value.first), value.second);
});
Run Code Online (Sandbox Code Playgroud)

我找到的错误是lambda的参数列表.交换被调用,我觉得在对的拷贝构造函数,试图从传递到拉姆达的参数右值先分配.编译器认为"value.first"在std :: pair复制构造函数中被赋值时是const.但显然,参数不是const限定的,mapped_type或key_type不是const限定的,复制构造函数不是const方法,并且没有任何关系.

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\utility(209) : see reference to …
Run Code Online (Sandbox Code Playgroud)

c++ lambda boost-variant visual-c++ c++11

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

调用std :: map :: find时,"map/set iterators incompatible"

C++ 0x11(有点.你知道,微软和所有...),Visual Studio 2010 SP1,Windows 7企业版.

我有一个功能:

// typedef boost::variant</*stuff*/> value_t;
// typedef unsigned short key_t
// typedef std::map<key_t, value_t> map_t

value_t find(const key_t key, const map_t &map)
{
    const map_t::const_iterator iter(map.find(key));

    // ...More stuff and then return.
}
Run Code Online (Sandbox Code Playgroud)

在std :: map :: find的主体内,有一个迭代器比较,我收到错误消息"map/set iterators incompatible",如VC\include\xtree:321中所定义.这个错误的本质是来自两个不同容器的迭代器相互比较,但错误来自容器自己的查找功能!从零开始,另一个容器的迭代器可能来自何处.

好的,症状:

  • 一个线程应用程序.
  • 它仅在运行时,在实际应用程序的随机压力测试期间发生.
  • 我们没有看到任何类型的无效或明显的垃圾场.

我对更大社区的问题:

假设这是一个线程环境中的计时错误,可以改变映射的内部状态,在这个过程中途,修改模板类的值_Tree_const_iterator :: _ Getcont()?我假设在此线程中的查找完成之前,正在清除并重新填充另一个线程中的映射.可以这样做吗?或者交换或移动操作怎么样?

我将追踪丢失的互斥锁或其他什么,我只是想确保我理解所有合理的方法,我可以进入这种状态,给定这个上下文.

c++ iterator map visual-studio-2010 c++11

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