匿名命名空间和命名命名空间之间的函数重载
Function overloading between anonymous namespace and named namespace
这是不允许的吗?有人可以解释一下为什么吗?
Algorithms.h
namespace Algorithms
{
int kthLargest(std::vector<int> const& nums, int k);
}
Algorithms.cpp
#include "Algorithms.h"
namespace
{
int kthLargest(std::vector<int> const& nums, int start, int end, int k)
{
<implementation>
}
} // end anonymous namespace
namespace Algorithms
{
int kthLargest(std::vector<int> const& nums, int k)
{
return kthLargest(nums, 0, nums.size() - 1, k);
}
} // end Algorithms namespace
我运行的错误是:
> /usr/bin/c++ -I../lib/algorithms/inc -MD -MT
> lib/algorithms/CMakeFiles/algorithms.dir/src/Algorithms.o -MF
> lib/algorithms/CMakeFiles/algorithms.dir/src/Algorithms.o.d -o
> lib/algorithms/CMakeFiles/algorithms.dir/src/Algorithms.o -c
> ../lib/algorithms/src/Algorithms.cpp
> ../lib/algorithms/src/Algorithms.cpp: In function ‘int
> Algorithms::kthLargest(const std::vector<int>&, int)’:
> ../lib/algorithms/src/Algorithms.cpp:70:50: error: too many arguments
> to function ‘int Algorithms::kthLargest(const std::vector<int>&, int)’
> return kthLargest(nums, 0, nums.size() - 1, k);
您的代码导致递归调用。当在 Algorithms::kthLargest
中调用 kthLargest
时,名称 kthLargest
将在命名空间 Algorithms
中找到,然后 name lookup 停止,没有进一步的范围(例如全局命名空间)将被检查。之后,执行重载决策并失败,因为参数不匹配。
你可以改成
namespace Algorithms
{
int kthLargest(std::vector<int> const& nums, int k)
{
// refer to the name in global namespace
return ::kthLargest(nums, 0, nums.size() - 1, k);
// ^^
}
}
或
namespace Algorithms
{
using ::kthLargest; // introduce names in global namespace
int kthLargest(std::vector<int> const& nums, int k)
{
return kthLargest(nums, 0, nums.size() - 1, k);
}
}
这是不允许的吗?有人可以解释一下为什么吗?
Algorithms.h
namespace Algorithms
{
int kthLargest(std::vector<int> const& nums, int k);
}
Algorithms.cpp
#include "Algorithms.h"
namespace
{
int kthLargest(std::vector<int> const& nums, int start, int end, int k)
{
<implementation>
}
} // end anonymous namespace
namespace Algorithms
{
int kthLargest(std::vector<int> const& nums, int k)
{
return kthLargest(nums, 0, nums.size() - 1, k);
}
} // end Algorithms namespace
我运行的错误是:
> /usr/bin/c++ -I../lib/algorithms/inc -MD -MT
> lib/algorithms/CMakeFiles/algorithms.dir/src/Algorithms.o -MF
> lib/algorithms/CMakeFiles/algorithms.dir/src/Algorithms.o.d -o
> lib/algorithms/CMakeFiles/algorithms.dir/src/Algorithms.o -c
> ../lib/algorithms/src/Algorithms.cpp
> ../lib/algorithms/src/Algorithms.cpp: In function ‘int
> Algorithms::kthLargest(const std::vector<int>&, int)’:
> ../lib/algorithms/src/Algorithms.cpp:70:50: error: too many arguments
> to function ‘int Algorithms::kthLargest(const std::vector<int>&, int)’
> return kthLargest(nums, 0, nums.size() - 1, k);
您的代码导致递归调用。当在 Algorithms::kthLargest
中调用 kthLargest
时,名称 kthLargest
将在命名空间 Algorithms
中找到,然后 name lookup 停止,没有进一步的范围(例如全局命名空间)将被检查。之后,执行重载决策并失败,因为参数不匹配。
你可以改成
namespace Algorithms
{
int kthLargest(std::vector<int> const& nums, int k)
{
// refer to the name in global namespace
return ::kthLargest(nums, 0, nums.size() - 1, k);
// ^^
}
}
或
namespace Algorithms
{
using ::kthLargest; // introduce names in global namespace
int kthLargest(std::vector<int> const& nums, int k)
{
return kthLargest(nums, 0, nums.size() - 1, k);
}
}