gpt4 book ai didi

C++:将完全限定名与排序函数一起使用 - 不一致的行为

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:42 25 4
gpt4 key购买 nike

我有以下 C++ 代码计算容器的中位数,取自 Koenig 的 Accelerated C++。

中位数.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

中值测试.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;
}

这段代码可以正常编译和运行。但是,如果我稍作修改以使用数组而不是像这样的 vector 来测试中值函数...

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) 提供完全限定名称,此错误就会消失,但我想知道的是为什么我在这种情况下需要完全限定名称,但在 vector 示例中不需要。

最佳答案

第一个代码是由于所谓的参数相关查找而编译的。作为std::vector<double>::iterator属于命名空间 std然后函数sort也在这个命名空间中查找。

当您使用指针时,就没有 ADL。因此编译器找不到名称 sort 的声明。 .

使用限定名称 std::sort .

关于C++:将完全限定名与排序函数一起使用 - 不一致的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40943295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com