我有以下代码:
#include <vector>
struct TestStruct {
std::vector<float> float_vect;
std::vector<bool> bool_vect;
};
void func(const TestStruct & test)
{
const float * p1 = test.float_vect.data(); //<--- this line works fine
const bool * p2 = test.bool_vect.data(); //<--- on this line error happens
}
int main()
{
TestStruct test;
func(test);
}
错误讯息:
将'const std :: vector'作为'void std :: vector :: data()[with _Alloc = std :: allocator]的'this'参数传递'丢弃限定符[-fpermissive]
data()
的{{1}}方法指定了std::vector
。
为什么这个方法在float向量上工作正常,并在布尔向量上引发错误?
答案 0 :(得分:3)
vector<bool>
是一个好的旧vector<T>
的特化,它的实现可能与普通的vector
不同(例如,可以采用一些节省空间的优化)。这种设计的副作用是它并不总是像普通的vector
那样(很多人认为vector<bool>
因此而被打破)。
例如,http://en.cppreference.com/w/cpp/container/vector_bool处的引用根本没有提到vector<bool>::data()
。因此 - 使用vector
类型bool
时,不应使用它。您没有收到与method not found
类似的错误这一事实 - 在您的情况下 - 只是编译器实现vector<bool>
的方式。
答案 1 :(得分:1)
std::vector<bool>
是STL中类std::vector<T>
的模板特化。为了使用更少的内存,布尔值以字节存储8。这意味着没有可以访问的直接数据,因为类不会以与其他类型相同的方式存储它。
查看doc:
特殊化与非特殊化向量具有相同的成员函数,除了data,emplace和emplace_back,这些特殊化中不存在。