2010-09-13 42 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

相關問題