2016-04-15 18 views
0

Ich halte diese Fehler bekommen, wenn make läuft:Führt mich GoogleMock dazu, einen Destruktor in einer Scheinklasse zu implementieren?

debug/main.o: In function `MockMQAdapter<SomeClass>::MockMQAdapter()': 
/source/Tests/testsfoo/MockMQAdapter.h:30: undefined reference to `MQAdapter<SomeClass>::~MQAdapter()' 
debug/main.o:(.rodata._ZTVN2TW9MQAdapterI6ThingyEE[_ZTVN2TW9MQAdapterI6ThingyEE]+0x10): undefined reference to MQAdapter<SomeClass>::~MQAdapter()' 
debug/main.o:(.rodata._ZTVN2TW9MQAdapterI6ThingyEE[_ZTVN2TW9MQAdapterI6ThingyEE]+0x18): undefined reference to `MQAdapter<SomeClass>::~MQAdapter()' 
debug/main.o:(.rodata._ZTVN2TW9MQAdapterI6ThingyEE[_ZTVN2TW9MQAdapterI6ThingyEE]+0x20): undefined reference to `MQAdapter<SomeClass>::publish(std::string const&, std::string &message)' 

Hier ist mein Code:

#include <gmock/gmock.h> 

template<typename S> 
class MQAdapter { 
public: 
    MQAdapter(const std::string host, uint16_t port); 
    virtual ~MQAdapter(); 
    virtual void publish(const std::string queue, std::string message); 
}; 

MQAdapter::MQAdapter(const std::string host, uint16_t port) {} 

//Generated by gmock_gen.py 
template <typename T0> 
class MockMQAdapter : public MQAdapter<T0> { 
public: 
    MOCK_METHOD2_T(publish, 
     void(std::string, std::string)); 
}; 

ich die Google-Mock-Führer ziemlich genau beobachtet werden. Ich verstehe nicht, was diese Fehler bedeuten. Hier ist, was mein Test wie folgt aussieht:

TEST(MyTest, ExpectCall) { 
    MockMQAdapter<SomeClass> *adapter = new MockMQAdapter<SomeClass>("host", 1); 
    EXPECT_CALL(*adapter, publish("hi", "hello")); 
    adapter->publish("hi", "hello"); 
} 
+0

Sind die ersten und zweiten Codefragmente in verschiedenen Übersetzungseinheiten (C++ - Dateien)? – Csq

+0

Warum haben Sie '~ MQAdapter()' nicht definiert? –

Antwort

1

Sie MQAdapter destructor deklariert haben, aber nicht definiert. Daher klagt der Linker, wenn er versucht, es zu lösen. Geben Sie eine Definition, default wäre genug, d. H. virtual ~MQAdapter() = default;.

Auf der anderen Seite, die Definition des Konstruktor sollte mit den Template-Parametern inline oder qualifiziert sein:

template <typename S> 
MQAdapter<S>::MQAdapter(const std::string host, uint16_t port) {} 

Ich denke, es liegt daran, dass nur ein Beispiel ist, aber Sie verwenden nicht die MQAdapter Template-Parameter für irgendetwas, also könnte es eine regelmäßige Klasse sein.