C++ 用“引用”表示重叠功能;使用名称空间std";

C++ 用“引用”表示重叠功能;使用名称空间std";,c++,C++,我很清楚这样做的陷阱。例如: #include <iostream> #include <tuple> using namespace std; //a simple function that returns the index of max and max value of a parameter pack template <typename...T> tuple<int, int> max(T... args) { const i

我很清楚这样做的陷阱。例如:

#include <iostream>
#include <tuple>

using namespace std;

//a simple function that returns the index of max and max value of a parameter pack
template <typename...T>
tuple<int, int> max(T... args) 
{
  const int size = sizeof...(args);
  int list[size] = {args...};

  int max_i = 0;
  int max = list[0];

  for (int i = 1; i < size; i++)
    {
      if (list[i] > max)
        {
          max_i = i;
          max = list[i];
        }
    }  
  return std::tuple<int, int>{max_i, max};
}

int main()
{
  int a ,b;
  tie(a, b) = max(10, 20, 30);

  return 0;
}
#包括
#包括
使用名称空间std;
//一个简单函数,返回参数包的max和max值的索引
模板
元组最大值(T…args)
{
常量int size=sizeof…(args);
int list[size]={args…};
int max_i=0;
int max=列表[0];
对于(int i=1;i最大值)
{
max_i=i;
max=列表[i];
}
}  
返回std::tuple{max_i,max};
}
int main()
{
INTA,b;
领带(a,b)=最大(10,20,30);
返回0;
}

My函数的优先级低于
std::max
,并产生错误。我想知道,在使用名称空间std声明
时,是否有方法仍然引用我的
max
函数。您无需提醒我不要声明它。

您可以使用范围解析操作符调用特定的
max
重载,以确保执行限定名称查找而不是非限定名称查找:

::max(10, 20, 30);

在这种情况下,过载解析将考虑您自己的<>代码> max > /Cult>函数重载,作为一个更好的生存函数,而不是在<代码> STD命名空间中的超载。从[强调我的]:

命名空间成员 [……]

命名空间
N
范围内的限定查找首先考虑 位于
N
中的所有声明以及 位于
N
的内联命名空间成员中(并且,可以传递, 在其内联命名空间成员中)。如果文件中没有声明 该集合然后考虑由指定的所有名称空间中的声明 使用
N
和所有可传递的内联命名空间中的指令
N
的成员。[……]


我需要提醒你不要申报,因为你已经申报了。@eerorika这是哪里记录的?那是因为C吗?我想是的。但事实证明C没有
max
。它具有
fmax
。因此,声明
::max
是可以的。我仍然主张在实际项目中声明名称空间中的所有内容。@eerorika我想,否则,标准的相关部分将适用?@dfri是的,还有/4。