Почему gtest не видит определение ==? - PullRequest
1 голос
/ 17 марта 2019

У меня есть шаблонный класс Matrix:

    template<typename T>
    class Matrix {
        //blah-blah-blah
        }

И следующий оператор:

template<typename T>
bool operator==(const Matrixes::Matrix<T> &lhs, const Matrixes::Matrix<T> &rhs) {
    if (lhs.get_cols()!=rhs.get_cols() || lhs.get_rows()!=rhs.get_rows()){
        return false;
    }
    for (int r = 0; r < lhs.get_rows(); ++r) {
        for (int c = 0; c < lhs.get_cols(); ++c) {
            if (lhs.get(r, c) != rhs.get(r, c)) {
                return false;
            }
        }

    }
    return true;
}

Вышеупомянутый оператор определен вне пространства имен Matrixes.

У меня есть несколько тестов (я использую фреймворк Google Tests). Однако, если я напишу что-то вроде:

TEST(MatrixOperations, MatrixMultiplicationSimple) {
    Matrixes::Primitives<int>::VectorMatrix vec1{{{8, 3, 5, 3, 8}, {5, 2, 0, 5, 8}, {0, 3, 8, 8, 1}, {3, 0, 0, 5, 0}, {2, 7, 5, 9, 0}}};
    Matrixes::Primitives<int>::VectorMatrix vec2{{{3, 1, 7, 2, 9}, {4, 6, 2, 4, 5}, {2, 5, 9, 4, 6}, {5, 3, 3, 1, 2}, {1, 8, 2, 6, 8}}};
    Matrixes::Matrix<int> vec1m{vec1};
    Matrixes::Matrix<int> vec2m{vec2};
    Matrixes::Matrix<int> matrix_out_ref{{{69, 124, 132, 99, 187}, {56, 96, 70, 71, 129}, {69, 90, 104, 58, 87}, {34, 18, 36, 11, 37}, {89, 96, 100, 61, 101}}};
    Matrixes::Matrix<int> matrix_out_fact = vec1m * vec2m;
    bool t = matrix_out_fact == matrix_out_ref;
    EXPECT_EQ(t, true);
}

все отлично работает. Обратите внимание, что я использую operator== «вручную» здесь:

 bool t = matrix_out_fact == matrix_out_ref;
 EXPECT_EQ(t, true);

Однако, если вместо этих двух строк я напишу что-то вроде:

EXPECT_EQ(matrix_ou_fact, matrix_out_ref);

Я получаю ошибку компиляции:

/usr/local/include/gtest/gtest.h:1522:11: error: no match for ‘operator==’ (operand types are ‘const Matrixes::Matrix<int>’ and ‘const Matrixes::Matrix<int>’)
   if (lhs == rhs) {

Почему gtest не "видит" определение operator==?

Спасибо

1 Ответ

4 голосов
/ 17 марта 2019

Сравнение внутри EXPECT_EQ происходит в другом объеме, чем ваш непосредственный тестовый пример.Он ищет операторную функцию, которую нужно вызвать через зависимый от аргумента поиск (ADL).Поскольку ваша операторская функция не находится в том же пространстве имен, что и ваш класс, она не воспринимается ADL.

Это работает внутри вашего непосредственного контрольного примера, потому что вы, вероятно, включаете соответствующие заголовки в соответствующем порядке, так что поиск оператора не зависит от ADL.Но реализация платформы Gtest имеет , на которую можно положиться в ADL.

Так что это легко исправить.Переместите свой пользовательский оператор в пространство имен Matrixes.Это часть открытого интерфейса вашего класса, так что в любом случае он принадлежит к одному и тому же пространству имен.

...