2017-07-06 4 views
1

J'utilise un code similaire basé sur l'exemple suivant:Google Mock - opérateur conversion privé int

class FOO 
{ 
private: 
    operator int() const; 
}; 

class BARMOCK 
{ 
public: 
    MOCK_METHOD1(Bar, void(const FOO& foo)); 
}; 

Malheureusement, le message d'erreur suivant est généré par le compilateur:

gtest/internal/gtest-internal.h(892): error C2248: 'FOO::operator int': cannot access private member declared in class 'FOO' 

qui vient de gtest-internal lui-même:

static const bool value = sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1; 

Y at-il un moyen possible de le faire rk, ou est-ce une limitation connue du cadre de google maquette?

Bien sûr, il existe des moyens de contourner le problème, comme:

class BARMOCK 
{ 
public: 
    MOCK_METHOD1(BarMock, void()); 
    void Bar(const FOO& foo) { BarMock(); } 
}; 

Mais ceci est juste une solution, pas une vraie solution. Est-ce que quelqu'un sait quelque chose à ce sujet? Merci.

Répondre

0

Le problème est que googlemock veut imprimer vos valeurs FOO. Et il se comporte selon cet algorithme:

  1. Si vous avez défini la fonction PrintTo(FOO const&, std::ostream*) il est utilisé
  2. Sinon, s'il est possible d'imprimer via voie C++ classique (avec operator <<), il est utilisé
  3. Dans le cas contraire, les octets qui représente cet objet FOO sont imprimés

Dans votre cas compilateur C++ (non googlemock) est « dupé » par votre opérateur cast private int - int est imprimable - si std::cout << FOO{} est Prin tableau - mais - puis avis du compilateur que cette conversion est privé ...

Alors:

  1. soit défini PrintTo(FOO const&, std::ostream*)
  2. Ou définir std::ostream& operator << (std::ostream&, const FOO&) - cet opérateur peut être défini comme fonction ami,

comme:

class FOO { 
    friend std::ostream& operator << (std::ostream& os, const FOO& foo) 
    { 
     return os << static_cast<int>(foo); 
    }