Перегрузка функций между анонимным пространством имен и именованным пространством имен - PullRequest
0 голосов
/ 31 декабря 2018

Разве это не разрешено?Может кто-нибудь объяснить, почему?

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);

1 Ответ

0 голосов
/ 31 декабря 2018

Ваш код приводит к рекурсивному вызову.Когда kthLargest вызывается внутри Algorithms::kthLargest, имя kthLargest будет найдено в пространстве имен Algorithms, тогда поиск имени останавливается, дальнейшие области (например, глобальное пространство имен) не будут проверяться.После этого выполняется разрешение перегрузки и происходит сбой, поскольку аргументы не совпадают.

Вы можете изменить его на

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);
   }
} 
...