c++ - 如何在 C++ 中合法地声明向量变量?
问题描述
我是 C++ 新手,并试图了解声明向量的工作原理。下面是一些例子:
std::vector j;
std::vector<char[256]> k;
std::vector<double> v;
std::vector<std::vector<int>> s;
我的想法只是std::vector<double> v
合法的,我自己测试了它,只有这行代码编译没有错误。但显然所有这些都是允许的。有人可以解释一下其他人是如何工作的,为什么其他人在我运行它时会给我错误?
所以如果我运行这段代码:
#include <iostream>
#include <vector>
int main() {
//std::vector j;
std::vector<char[256]> k;
std::vector<double> v;
std::vector<std::vector<int>> s;
}
我在编译时遇到了一堆错误(我在 Xcode 中使用 Atom g++ 编译器包):
C++ - test.cpp:12
In file included from <built-in>:2:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/iostream:37:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/ios:215:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/__locale:14:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/string:504:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/string_view:175:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/__string:56:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/algorithm:643:
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:1880:61: error: object expression of non-scalar type 'char [256]' cannot be used in a pseudo-destructor expression
_LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();}
~~~^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:1742:18: note: in instantiation of member function 'std::__1::allocator<char [256]>::destroy' requested here
{__a.destroy(__p);}
^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:1595:14: note: in instantiation of function template specialization 'std::__1::allocator_traits<std::__1::allocator<char [256]> >::__destroy<char [256]>' requested here
{__destroy(__has_destroy<allocator_type, _Tp*>(), __a, __p);}
^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/vector:426:25: note: in instantiation of function template specialization 'std::__1::allocator_traits<std::__1::allocator<char [256]> >::destroy<char [256]>' requested here
__alloc_traits::destroy(__alloc(), _VSTD::__to_raw_pointer(--__soon_to_be_end));
^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/vector:369:29: note: in instantiation of member function 'std::__1::__vector_base<char [256], std::__1::allocator<char [256]> >::__destruct_at_end' requested here
void clear() _NOEXCEPT {__destruct_at_end(__begin_);}
^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/vector:463:9: note: in instantiation of member function 'std::__1::__vector_base<char [256], std::__1::allocator<char [256]> >::clear' requested here
clear();
^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/vector:495:5: note: in instantiation of member function 'std::__1::__vector_base<char [256], std::__1::allocator<char [256]> >::~__vector_base' requested here
vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
^
/Users/moeheinag/Desktop/C++/UIUC/Course1/test.cpp:7:24: note: in instantiation of member function 'std::__1::vector<char [256], std::__1::allocator<char [256]> >::vector' requested here
std::vector<char[256]> k;
^
1 error generated.
[Finished in 0.375s]
解决方案
std::vector
在C++03 之前(包括 C++03),不允许使用a 的固定数组模板。这是因为数组既不是CopyAssignable也不是CopyConstructible。
std::vector<char[256]> k;
C++ 11 之前的版本也是无效的。从 C++11 开始,您可以声明这样的类型,尽管使用这样的实例化会遇到困难 - 例如push_back
,不会工作,但位置会。使用std::array<char, 256>
代替char[256]
是一个明显的解决方法。
另请注意,C++ 11 之前的版本std::vector<std::vector<int>> s;
也无效 - 您需要在两者之间留一个空格,>>
否则编译器会将>>
其视为按位移位!
换句话说,升级到 C++11。
推荐阅读
- c - 使用makefile时,找到了linux头文件,但是当调用头文件中的函数时,它说它们是隐式声明的
- c - 如何在缓冲区 c 中拆分令牌?
- python - 如何使用opencv从python中的图像中找到矩形的坐标?
- android - 在 Android 设备上使用 Unity 的 Admob 广告
- objective-c - 在 Swift 中使用 Objective-C typedef void
- node.js - SELECT FROM sqlite_master db 查询返回未定义
- gradle - 每个工具链的 Gradle 本机库
- node.js - 从 nodejs 中的 Lambda 返回音频缓冲区时,AWS ALB 返回 502 Bad Gateway
- maxima - 将列表插入到 Maxima 上的循环方程中
- python - 在 Python 中,如何读取输入文件然后将其转换为莫尔斯电码?