gpt4 book ai didi

c++ - Principles and Practice using C++ 中头文件的错误消息

转载 作者:行者123 更新时间:2023-11-30 01:21:30 24 4
gpt4 key购买 nike

我刚刚开始使用编程学习 C++:使用 C++ 的原理和实践。那本书告诉我使用一个头文件来为我设置东西。有问题的头文件位于 http://www.stroustrup.com/Programming/std_lib_facilities.h

我正在尝试一个要求我写一个素筛的练习。我有以下程序:

#include "std_lib_facilities.h"

void sieve_erat(int end) {
vector<bool> primes (end, true);
int final_element = sqrt(end) + 1;
for (int i=2; i<final_element; ++i)
if (primes[i])
for (int j=i*i; j<end; j += i)
primes[j] = false;

for (int p=2; p<end; ++p)
if (primes[p])
cout << p << " ";
cout << '\n';
}

int main() {
cout << "Enter the number to which I should find the primes: ";
cin >> max;
sieve_erat(max);
return 0;
}

但是当我在我的计算机上使用 g++ primes.cpp 编译时,我得到以下输出:

~/src/c++ $ g++ primes.cpp 
In file included from /usr/include/c++/4.8.1/ext/hash_map:60:0,
from std_lib_facilities.h:34,
from primes.cpp:4:
/usr/include/c++/4.8.1/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header which may be removed without further notice at a future date. Please use a non-deprecated interface with equivalent functionality instead. For a listing of replacement headers and interfaces, consult the file backward_warning.h. To disable this warning use -Wno-deprecated. [-Wcpp]
#warning \
^
In file included from primes.cpp:4:0:
std_lib_facilities.h: In instantiation of ‘T& Vector<T>::operator[](unsigned int) [with T = bool]’:
primes.cpp:36:17: required from here
std_lib_facilities.h:88:38: error: invalid initialization of non-const reference of type ‘bool&’ from an rvalue of type ‘std::vector<bool, std::allocator<bool> >::reference {aka std::_Bit_reference}’
return std::vector<T>::operator[](i);
^

我已尽最大努力在网上找到这个问题的答案,但我就是不明白消息在告诉我我做错了什么!请有人能给我指出正确的方向吗?

谢谢。

最佳答案

(您确定这是您正在编译的代码吗?max 在哪里声明?)

std::vector<bool>very strange beast这不像std::vector<T>对于任何其他 T .

不幸的是 std::vector<bool>在您的情况下似乎是显而易见的选择,它迫使您处理 std::vector<bool> 的奇怪情况它不适用于 Stroustrup 的 Vector类模板。

错误的详细解释是Stroustrup的header重新定义了vector引用他的Vector模板,它向元素访问运算符添加了一些范围检查(即 operator[] ,这是您说 primes[i] 时使用的那个)。重新定义 vector不能用 bool 实例化因为std::vector<bool>::operator[]不返回正常引用,并且重新定义了 vector期望它这样做。

关于c++ - Principles and Practice using C++ 中头文件的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17930442/

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