代码之家  ›  专栏  ›  技术社区  ›  Andres Jaan Tack

如何用签名`object()模拟函数`

  •  2
  • Andres Jaan Tack  · 技术社区  · 14 年前

    A::B X(void) . 定义如下。

    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() );
        };
    }
    
    1 回复  |  直到 14 年前
        1
  •  4
  •   Todd Gardner    14 年前

    如果没有A和B的定义,就很难判断。听起来像是在尝试从临时构造B,但失败了,因为它无法将临时绑定到非常量引用。

    例如,复制构造函数可以定义为:

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

    修正只是一个常量引用。