2016-04-15 3 views
0

Je continue à recevoir ces erreurs lors de l'exécution make:Est-ce que GoogleMock me fait implémenter un destructeur dans une classe fictive?

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

Voici mon 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)); 
}; 

J'ai suivi les guides simulacres google assez près. Je ne comprends pas ce que ces erreurs signifient. Voici ce que mon test ressemble à:

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

Les premiers et deuxièmes extraits de code dans différentes unités de traduction (fichiers C++)? – Csq

+0

Pourquoi n'avez-vous pas défini '~ MQAdapter()'? –

Répondre

1

Vous avez déclaré MQAdapter destructor, mais pas la définir. Ainsi, l'éditeur de liens se plaint quand il essaie de le résoudre. Fournissez une définition, default suffirait, c'est-à-dire virtual ~MQAdapter() = default;.

D'autre part, la définition du constructeur doit être en ligne ou qualifié avec le paramètre de modèle:

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

Je suppose que c'est parce que c'est juste un exemple, mais vous n'êtes pas en utilisant le paramètre de modèle MQAdapter pour n'importe quoi, alors ça pourrait être une classe régulière.