2010-09-13 9 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()); 
}; 

Скомпилированный, однако, это дает мне эту ошибку weirdo, и я не смог ее отслеживать. Что не так с этим?

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&) 

Update Я нашел неудовлетворительную образец кода, чтобы продемонстрировать это.

#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

+0

'MOCK_METHOD0' предоставлен Google Mock, здесь: http://code.google.com/p/googlemock/wiki/CheatSheet#Mocking_a_Normal_Class –

+0

Я не смог воспроизвести это на небольшом фрагменте кода, хотя они следуют все обычные шаблоны для Google Mock. Я приведу эскиз A, B и X здесь. –

ответ

4

Трудно сказать, без определения А и В. звучит, как он пытается построить B с временным и не суметь, потому что он не может связать временное с неконстантной ссылкой.

Например, ваш конструктор копирования может быть определен как:

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

С затруднительное просто делает его константной ссылки.

+0

Хм, я не определяю конструктор копирования, но, может быть ... на это повлияют внутренние члены класса? 'auto_ptr', например? –

+3

Абсолютно, auto_ptr имеет конструктор без константы, и он заставляет B иметь конструктор неконстантной копии. –

+0

В качестве исправления вы должны рассмотреть, что вы хотите сделать с этим указателем в случае копирования; Используйте общий указатель, если хотите, чтобы копия делилась доступом между классами (возможно, только хорошо, если объект, указывающий на объект, является неизменяемым), или напишите свой экземпляр копии, который клонирует все объекты (если они должны иметь свои собственные) или сделать объект не подлежит сомнению и изменить интерфейс A, чтобы вместо этого передать некоторый дескриптор B. –

Смежные вопросы