Koenig에 의해 Accelerated C++에서 가져온 컨테이너의 중앙값을 계산하는 다음 C++ 코드가 있습니다.C++ : 정렬 함수에 일관성있는 이름 사용 - 일관되지 않은 동작
median.h
#ifndef GUARD_median_h
#define GUARD_median_h
#include <stdexcept>
#include <algorithm>
#include <cstddef>
template<class T, class Iterator>
T median (Iterator begin, Iterator end)
{
size_t size = end - begin;
if (size == 0)
throw std::domain_error("median of an empty vector");
sort(begin, end);
size_t mid = size/2;
return size%2 == 0 ? (begin[mid] + begin[mid-1])/2 : begin[mid];
}
#endif
median_test.cpp
#include <vector>
#include <iostream>
#include "median.h"
using std::vector; using std::cin;
using std::cout; using std::endl;
int main()
{
vector<double> myVec;
cout << "Please enter integers: ";
double val;
while (cin >> val) {
myVec.push_back(val);
}
cout << "The median is: " << median<double>(myVec.begin(), myVec.end()) << endl;
return 0;
}
이 코드는 컴파일과 잘 실행됩니다. 하지만 약간의 수정이 배열보다는 그래서 같은 벡터 중간 기능 ...
median_test_array.cpp을 테스트 할 경우
#include <iostream>
#include "median.h"
using std::cin;
using std::cout; using std::endl;
int main()
{
double myVec[1000];
cout << "Please enter integers: ";
double val;
size_t i = 0;
while (cin >> val) {
myVec[i++] = val;
}
cout << "The median is: " << median<double>(myVec, myVec+i) << endl;
return 0;
}
나는 다음과 같은 컴파일 오류 얻을 :
| => g++-6 -I. median_test_array.cpp
In file included from median_test_array.cpp:2:0:
median.h: In instantiation of 'T median(Iterator, Iterator) [with T = double; Iterator = double*]':
median_test_array.cpp:19:60: required from here
median.h:15:9: error: 'sort' was not declared in this scope
sort(begin, end);
~~~~^~~~~~~~~~~~
median.h:15:9: note: suggested alternative:
In file included from /usr/local/Cellar/gcc/6.2.0/include/c++/6.2.0/algorithm:62:0,
from median.h:5,
from median_test_array.cpp:2:
/usr/local/Cellar/gcc/6.2.0/include/c++/6.2.0/bits/stl_algo.h:4727:5: note: 'std::sort'
sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
^~~~
을
정렬에 대한 정규화 된 이름 (std :: sort)을 지정하면이 오류가 사라지지만이 인스턴스에는 정규화 된 이름이 필요하지만 벡터 예제에는 필요하지 않은 이유가 무엇인지 알고 싶습니다.
http://stackoverflow.com/questions/8111677/what-is-argument-dependent-lookup-aka-adl-or-koenig-lookup – Brian