2011年7月7日木曜日

Overloaded methods is ambiguous.

オーバーロードしている関数で引数の数まで同じだと、悲しいことになる。

例えば、
#include <gmock/gmock.h>

using ::testing::Eq;
using ::testing::Return;
using ::testing::Matcher;

class X {
public:
    bool operator==(const X& other) const { return false; }
};

class Y {
public:
    bool operator==(const Y& other) const { return false; }
};

class Foo {
public:
    virtual ~Foo() { }

    virtual void function(X x) { }
    virtual void function(Y x) { }
};

class Mock : public Foo {
public:
    MOCK_METHOD1(function, void(X));
    MOCK_METHOD1(function, void(Y));
};

TEST(MockTest, Call_Foo_X) {
    Mock m;

    X arg;

    EXPECT_CALL(m, function(Eq(arg))).WillOnce(Return());
}

これをコンパイルすると
$ g++ -I/opt/vendor/include -L/opt/vendor/lib -lgtest -lgmock -c ambiguous.cc
ambiguous.cc:11: error: ISO C++ forbids declaration of ‘Interface’ with no type
ambiguous.cc:23: error: multiple types in one declaration
ambiguous.cc: In member function ‘virtual void MockTest_Call_Foo_X_Test::TestBody()’:
ambiguous.cc:28: error: call of overloaded ‘gmock_function(testing::internal::EqMatcher)’ is ambiguous
ambiguous.cc:19: note: candidates are: testing::internal::MockSpec& Mock::gmock_function(const testing::Matcher&)
ambiguous.cc:20: note:                 testing::internal::MockSpec& Mock::gmock_function(const testing::Matcher&)
ambiguousですよ。ambiguous!

で、どうすっかって。
EXPECT_CALL(m, function(Matcher(Eq(arg)))).WillOnce(Return());
明示的にMatcherで型を示してあげると。