2010-09-13 41 views
2

我想用声明A::B X(void)来模拟方法。定义如下。如何使用签名object()来模拟函数

class A { 
    class B; 
    virtual B X() = 0; 
}; 

class A::B { 
    public: 
    auto_ptr<int> something; 
}; 

我的模拟课,以下是相当标准的。

class mA : public A 
{ 
    public: 
    MOCK_METHOD0(X, A::B()); 
}; 

编译,但是,这给了我这个怪人的错误,我一直没能追查。这有什么问题?

In member function ‘virtual A::B mA::X()’: 
...: error: no matching function for call to ‘A::B::B(A::B)’ 
...: note: candidates are: A::B::B() 
...:      A::B::B(A::B&) 

更新我已经找到了失败的代码示例来证明这一点。

#include <gmock/gmock.h> 
#include <memory> 
using std::auto_ptr; 

class thing { 
    public: 
    class result; 
    virtual result accessor() = 0; 
}; 

class thing::result { 
    auto_ptr<int> x; // If this just "int", error goes away. 
}; 

namespace mock { 
    class thing : ::thing { 
     public: 
     MOCK_METHOD0 (accessor, result()); 
    }; 
} 
+0

“MOCK_METHOD0”,“A”,“B”和“X”的定义是...? – GManNickG 2010-09-13 17:11:11

+0

'MOCK_METHOD0'由Google Mock提供,在这里:http://code.google.com/p/googlemock/wiki/CheatSheet#Mocking_a_Normal_Class – 2010-09-13 17:12:02

+0

我还没有能够在较小的代码片段上重现此操作,但它们会遵循Google Mock的所有正常模式。我会在这里画一个A,B和X的草图。 – 2010-09-13 17:13:55

回答

4

这是很难说没有A的定义和B.听起来就像是试图从临时构建一个B和失败,因为它不能在临时绑定到一个非const引用。

例如,你的拷贝构造函数可以被定义为:

class A { 
public: 
    class B { 
    public: 
    // This should be const, without good reason to make it otherwise. 
    B(B&); 
    }; 
}; 

随着修复只是使其成为一个const引用。

+0

嗯,我没有定义拷贝构造函数,但也许......这会受到班级内部成员的影响吗? 'auto_ptr',比如? – 2010-09-13 17:26:06

+3

当然,auto_ptr有一个非const拷贝构造函数,它强制B有一个非const拷贝构造函数。 – 2010-09-13 17:31:18

+0

作为一个修复,你应该考虑你想要在复制案例中使用那个指针;如果想要副本共享类之间的访问权(如果指向的对象是不可变的,那么可以使用共享指针),或者编写克隆任何对象(如果它们都应该拥有自己的对象)的副本副本构造函数,或者编写该对象是不可复制的,并且围绕A的接口进行更改,以便将某个句柄传递给B。 – 2010-09-13 17:35:34

相关问题