此程序无法编译 ( error: 'foo' is not a member of 'N'
):
namespace N {
// void foo();
}
template<class T>
void template_func(T t) {
N::foo(t);
}
但是如果我们取消注释 void foo();
的声明,它编译。 Demo .两个版本都有错误。
foo
即使声明,也不接受任何参数。下面的问题提出了自己。我的理论如下(是否正确?)。内
template_func
N::foo
同时是限定名和从属名。依赖名称的查找被推迟到模板的实例化。查找名称(如果成功)会导致将该名称的使用与该名称的声明联系起来。但是这个过程包括两个步骤(让我们现在只考虑限定名称,看起来像一个函数调用):N
)。这可能会找到多个名称,因为函数可以被重载。 foo
在 N
.这种方式使用N::foo
与 N::foo
相关联宣言。 实际上第一步可以在没有实例化的情况下完成。编译器好像做了,如果没有
foo
找到后,它会诊断错误(这是可选的)。如果至少有一个 foo
发现它不打扰进一步分析。
最佳答案
您的分析似乎是正确的,并且您的代码格式错误,无需诊断,无论 void foo();
是否正确是否被注释掉。
您正在寻找的标准部分是:
[temp.res.general]/6.1
The program is ill-formed, no diagnostic required, if:
— no valid specialization can be generated for a template ...
关于c++ - 依赖限定名的查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66727031/