gpt4 book ai didi

c++ - 考虑模板参数的参数相关外观(ADL)?

转载 作者:行者123 更新时间:2023-11-30 03:26:41 27 4
gpt4 key购买 nike

我有几个命名空间,每个命名空间都有一个名为 f 的函数模板。

// f() and Widget
namespace A {
struct Widget { };

template <typename T>
void func(const T&) { }
}

// f() and caller()
namespace B {
template <typename T>
void func(const T&) { }

template <typename T>
void caller(const T& t) {
func(t); // error occurs here
}
}

template <typename T>
class Wrap { };

int main() {
Wrap<A::Widget> w{};
B::caller(w); // triggers error
}

上面产生了下面的错误

error: call of overloaded ‘func(const Wrap<A::Widget>&)’ is ambiguous
func(t);
~~~~^~~
note: candidate: void B::func(const T&) [with T = Wrap<A::Widget>]
void func(const T&) { }
^~~~
note: candidate: void A::func(const T&) [with T = Wrap<A::Widget>]
void func(const T&) { }
^~~~

如果 Wrap 在全局命名空间中,为什么要考虑 A::funcB::caller 不应该调用 B::func 吗?

最佳答案

在模板的情况下,ADL 不仅仅考虑函数的参数。在这里你有 Wrap<A::Widget>作为 B::caller 的参数.因为callernamespace B , B::func显然是考虑到了。 A::func的原因被考虑来自以下(重点添加)

N659 6.4.2/(2.2) [basic.lookup.argdep]

If T is a class type (including unions), its associated classes are: the class itself; the class of which it is a member, if any; and its direct and indirect base classes. Its associated namespaces are the innermost enclosing namespaces of its associated classes. Furthermore, if T is a class template specialization, its associated namespaces and classes also include: the namespaces and classes associated with the types of the template arguments provided for template type parameters [...]

因为 A::WidgetWrap 的模板参数, A也是 Wrap<A::Widget> 的关联命名空间

可以通过使用限定名称阻止 ADL 使此示例按预期编译:

template <typename T>    
void caller(const T& t) {
B::func(t);
}

或者通过将函数名括在括号中

template <typename T>    
void caller(const T& t) {
(func)(t);
}

关于c++ - 考虑模板参数的参数相关外观(ADL)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48103175/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com