Разрешение конфликтов в методах, вызывающих функции с одинаковыми именами в C++

Рассмотрим следующий урезанный пример (шаблонной) структуры C++ для квадратных матриц (ее не нужно шаблонировать для возникновения проблемы):

#include <array>
#include <complex>
using namespace std;

double conj (double &x) { return x; };

template <typename T, int N>
struct matrix: array<T,N*N> {
    void conj() {
        for (int ij=0; ij<100; ++ij) {
            T z = (*this)[ij];
            (*this)[ij] = conj(z);
        }
    }
};

int main() {
    matrix<double,10> a;
    a.conj();
    return 0;
}

Я хочу реализовать метод, который выполняет матричное комплексное сопряжение, используя имя.conj(), совпадающее с системой именования, используемой в библиотеке . Однако я получаю следующую ошибку:

$ g++ example.cpp -std=c++11
example.cpp: In instantiation of ‘void matrix<T, N>::conj() [with T = double; int N = 10]’:
example.cpp:19:12:   required from here
example.cpp:12:26: error: no matching function for call to ‘matrix<double, 10>::conj(double&)’
      (*this)[ij] = conj(z);
                          ^
example.cpp:12:26: note: candidate is:
example.cpp:9:10: note: void matrix<T, N>::conj() [with T = double; int N = 10]
     void conj() {
          ^
example.cpp:9:10: note:   candidate expects 0 arguments, 1 provided

Компилятор, похоже, не распознает функцию Con (double&), вызываемую внутри метода с тем же именем и определяемую перед структурой. Вместо этого он пытается вызвать метод Con ().

Почему компилятор не может разрешить этот конфликт имен, и каково решение, которое сохраняет именование? Конечно, если я поменяю имя метода на что-то другое, то код скомпилируется и запускается нормально.

1 ответ

Решение

Функция-член скрывает функции с одинаковыми именами в более широкой области.

Используйте полное имя ::conj ссылаться на функцию в глобальном пространстве имен.

Другие вопросы по тегам