3

考虑以下用于方阵的(模板化)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() 与 <complex> 库中使用的命名系统相一致。但是,我收到以下错误:

$ 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

编译器似乎无法识别在同名方法内部调用并在结构之前定义的函数conj(double&)。相反,它尝试调用方法conj()。

为什么编译器无法解决此命名冲突,保留命名的解决方案是什么?当然,如果我将方法的名称更改为与 conj 不同的名称,代码将正常编译并运行。

4

1 回答 1

9

成员函数将同名函数隐藏在更广泛的范围内。

使用限定名称::conj来引用全局命名空间中的函数。

于 2014-08-26T17:12:34.980 回答