我正在测试以下代码:
#include <iostream>
template<typename T>
class A {
public:
void koo(T) { std::cout << "Hello world!"; }
};
template <typename T>
class B : public A<T> {
public:
void pun(T i) { koo(i); }
};
int main() {
B<int> boo;
boo.pun(5);
}
编译信息为:
main.cpp:12:24: error: ‘koo’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
12 | void pun(T i) { koo(i); }
| ~~~^~~
main.cpp:12:24: note: declarations in dependent base ‘A’ are not found by unqualified lookup
main.cpp:12:24: note: use ‘this->koo’ instead
我知道我可以避免这个错误与this->koo(i)
或A<T>::koo(i)
,但我想了解为什么这个编译错误发生.
我认为pun
定义中的koo
是一个依赖名称,根据依赖名称/查找规则"模板中使用的依赖名称的查找被推迟,直到模板参数已知"。main
函数中,B<int> boo;
将模板参数设置为int
。那么为什么ADL不工作的函数表达式koo(i)
?————————————————————————————————
让我们暂时把ADL放在一边。如果我将void pun(T i) { koo(i); }
更改为void pun(T i) { goo(i); }
,现在新的编译信息是:
main.cpp:12:24: error: ‘goo’ was not declared in this scope; did you mean ‘koo’?
12 | void pun(T i) { goo(i); }
| ~~~^~~
| koo
为什么这两种情况的编译信息不同?新的错误没有提到"参数依赖查找"。。
ADL是参数依赖查找。在函数参数的相关名称空间中查找函数名。int
没有关联的名称空间,因此不会发生ADL。即使它发生了,它也只会找到自由函数,所以你的方法不会被找到。