为什么从基模板类继承的成员函数没有声明?



我正在测试以下代码:

#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。即使它发生了,它也只会找到自由函数,所以你的方法不会被找到。

相关内容

  • 没有找到相关文章

最新更新