gpt4 book ai didi

c++ - Google Mocked 成员函数中的 std::pair 参数编译失败

转载 作者:太空狗 更新时间:2023-10-29 21:48:50 25 4
gpt4 key购买 nike

我有一个单方法接口(interface)和一个模拟该接口(interface)的类。该方法采用单个参数。仅当该参数的类型为 std::pair<Something, Something> 时它是否无法编译。我正在使用 MSVC 2010,所以问题可能是编译器或 STL 实现特定的,当然,除非问题与湿软件相关,这是我最好的猜测。我一定错过了一些明显的东西。像纳米探针。

#include <gmock/gmock.h>

class BorgInterface
{
public:
typedef std::pair<int, long> MyBorg; // <--- MyBorg is problematic!
//typedef long MyBorg; // ..but this MyBorg complies
virtual void Assimilate( MyBorg borg_in_training ) = 0;
};

class MockBorg
: public BorgInterface
{
public:
MOCK_METHOD1( Assimilate, void( BorgInterface::MyBorg borg_in_training ));
};

/*TEST( MyBorgTestCase, BorgInterfaceTest )
{
using ::testing::_;

MockBorg funny_borg;
EXPECT_CALL( funny_borg, Assimilate( _ ));
// ...etc. (irrelevant)
}*/

实际的测试用例不必取消注释就会出现错误。

现在,我通过包装 std::pair<> 来解决这个问题在struct , 但这是次优的。

错误消息的长度相当不幸,但它可能会有所帮助:

1>Build started 3/31/2012 4:02:43 PM.
1>ClCompile:
1> test_pair_parameter_mock.cpp
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\tuple(127):
error C2664: 'std::pair<_Ty1,_Ty2>::pair(const std::pair<_Ty1,_Ty2> &)'
: cannot convert parameter 1 from 'int' to 'const std::pair<_Ty1,_Ty2> &'
1> with
1> [
1> _Ty1=int,
1> _Ty2=long
1> ]
1> Reason: cannot convert from 'int' to 'const std::pair<_Ty1,_Ty2>'
1> with
1> [
1> _Ty1=int,
1> _Ty2=long
1> ]
1> No constructor could take the source type,
or constructor overload resolution was ambiguous
1> c:\...\microsoft visual studio 10.0\vc\include\tuple(404)
: see reference to function template instantiation
'std::tr1::_Cons_node<_Car,_Cdr>::_Cons_node<
_Ty1&,_Ty2&,std::tr1::_Nil&,std::tr1::_Nil&,
std::tr1::_Nil&,
...............
std::tr1::_Nil&,
std::tr1::_Nil&>(_Farg0,...,_Farg9)' being compiled
1> with
1> [
1> _Car=BorgInterface::MyBorg,
1> _Cdr=std::tr1::_Tuple_type<
std::tr1::_Nil,
..............
std::tr1::_Nil,
std::tr1::_Nil>::_Type,
1> _Ty1=int,
1> _Ty2=long,
1> _Farg0=int &,
1> _Farg1=long &,
1> _Farg2=std::tr1::_Nil &,
1> .......................
1> _Farg9=std::tr1::_Nil &
1> ]
1> d:\...\gmock\include\gmock\gmock-generated-function-mockers.h(97) :
see reference to function template instantiation
'std::tr1::tuple<_Arg0>::tuple<int,long>(
std::pair<_Ty1,_Ty2> &)' being compiled
1> with
1> [
1> _Arg0=BorgInterface::MyBorg,
1> _Ty1=int,
1> _Ty2=long
1> ]
1> d:\...\gmock\include\gmock\gmock-generated-function-mockers.h(92) :
while compiling class template member function
'void testing::internal::FunctionMocker<Function>::Invoke(A1)'
1> with
1> [
1> Function=void (BorgInterface::MyBorg),
1> A1=BorgInterface::MyBorg
1> ]
1> d:\..\myapp\src\tests\unit_tests\test_pair_parameter_mock.cpp(17) :
see reference to class template instantiation
'testing::internal::FunctionMocker<Function>' being compiled
1> with
1> [
1> Function=void (BorgInterface::MyBorg)
1> ]
1>
1>Build FAILED.

最佳答案

看起来确实是一个编译器问题;这可以使用 gcc 4.6 编译。

一个更简单的解决方法是通过指向 const 的指针传递 MyBorg:

    virtual void Assimilate( const MyBorg *borg_in_training ) = 0;

或者如果您愿意使用 Boost,您可以将 std::pair 替换为 boost::tuple

    typedef boost::tuple<int, long> MyBorg;

关于c++ - Google Mocked 成员函数中的 std::pair 参数编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9956736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com