我的代码:
template <typename T>
void func(T v)
{
func2(v);
}
struct S {};
void func2(int) {}
void func2(S) {}
int main()
{
func(1); // error here
func(S{}); // OK
}
错误:
<source>: In instantiation of 'void func(T) [with T = int]':
<source>:14:9: required from here
14 | func(1); // error here
| ~~~~^~~
<source>:4:10: error: 'func2' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
4 | func2(v);
| ~~~~~^~~
<source>:10:6: note: 'void func2(S)' declared here, later in the translation unit
10 | void func2(S) {}
|
为什么查找func2
内置类型会失败,而查找用户定义的类型却会失败?
基本类型不适用于 ADL。来自cppreference
因此
func2(int);
有一个空集,因此出现编译器错误。对于类案例,我们有
并且引入的是项目 d,
void func2(S) {}
因为它与 位于同一个命名空间中S
。正如您在ADL 文档中看到的:
(重点是我的)
S
和func2
位于同一命名空间中。但int
并非如此,因此 ADL 不适用。注意:
正如@NathanOliver 的回答中详细解释的那样,基本类型不被视为 ADL 全局命名空间的一部分,因此即使您的代码不在命名空间中,上述内容仍然成立。