考虑以下用于方形矩阵的(模板化)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()与&lt;中使用的命名系统一致。复杂&gt;图书馆。但是,我收到以下错误:
$ 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&amp;),并在结构之前定义。相反,它尝试调用方法 conj()。
为什么编译器无法解决此命名冲突,以及保留命名的解决方案是什么?当然,如果我将方法的名称更改为与conj不同的名称,则代码将编译并正常运行。
答案 0 :(得分:7)
成员函数在更广泛的范围内隐藏同名函数。
使用限定名称::conj
来引用全局命名空间中的函数。