【发布时间】:2022-01-04 03:03:07
【问题描述】:
考虑以下最小示例,找不到function。依赖于参数的查找似乎失败了。为什么?
#include <iostream>
#include <array
namespace foo {
using Values = std::array<int, 2>;
void function(const Values& v) {std::cout << v[0] << " " << v[1] << '\n';}
}
int main() {
foo::Values v{1,2};
function(v);
return 0;
}
一个可能的解决方案是通过将using foo::function; 放在main 上方来导入function。有没有替代方法可以避免这种 using 语句?
【问题讨论】:
-
使用选项 1,
v的类型为std::array<int, 2>。通过 typedef 赋予该类型的事实是无关紧要的。 -
嗯,问题是关于被注释掉的代码,所以这不是一个最小的例子。显示不起作用的代码,而不是起作用的代码。
-
@IgorTandetnik 为什么不相关?我希望
using语句将名称Values(或std::array<int,2>)添加到命名空间foo,类似于在foo中定义结构。 -
您的预期不正确。用于 ADL 的关联命名空间是参数类型的属性,而不是在声明中碰巧命名该类型的别名。名称
Values在命名空间foo中;但参数的类型是std::array<int, 2>,它在命名空间std中,没有提到foo。所以ADL搜索std而不搜索foo -
@IgorTandetnik 我会接受它作为“为什么”的答案。
标签: c++ typedef using argument-dependent-lookup