我有以下代码
#include <utility>
using namespace std;
int a = ...//gets calculated somehow
int b = ...//same here
char container[a][b];
...
std::pair<int, char**> p = make_pair(1, container);
最后一行给了我
main.cpp:10:58: error: no matching function for call to 'make_pair(int, char [a][b])'
std::pair<int, char**> p = make_pair(1, container);
^
main.cpp:10:58: note: candidate is:
In file included from /usr/local/include/c++/4.9.2/utility:70:0,
from main.cpp:1:
/usr/local/include/c++/4.9.2/bits/stl_pair.h:276:5: note: template<class _T1, class _T2> constexpr std::pair<typename std::__decay_and_strip<_Tp>::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&)
make_pair(_T1&& __x, _T2&& __y)
^
/usr/local/include/c++/4.9.2/bits/stl_pair.h:276:5: note: template argument deduction/substitution failed:
main.cpp:10:58: note: variable-sized array type 'char (&)[a][b]' is not a valid template argument
std::pair<int, char**> p = make_pair(1, container);
^
main.cpp:10:32: warning: unused variable 'p' [-Wunused-variable]
std::pair<int, char**> p = make_pair(1, container);
答案 0 :(得分:4)
你的问题是双重的。首先,静态分配的数组的维度必须是编译时常量。可变长度数组(VLA)是非标准的,但某些编译器支持它们作为扩展。为了保持程序的标准一致性和可移植性,我会远离这些。
制作a
和b
const
就足够了:
int const a = 5;
int const b = 10;
char container[a][b];
接下来,p
的类型与make_pair(1, container)
返回的类型不匹配。在内部,make_pair
&#34;衰变&#34;推导出的参数类型(在这种情况下应用数组到指针的转换)。第二个参数container
的衰变类型不会变成char**
而是char (*)[3]
- 指向第一个元素的指针,该元素本身就是一个数组。
所以将该行改为此应该有效:
std::pair<int, char (*)[3]> p = std::make_pair(1, container);
您也可能希望使用auto
,以便类型扣除可以减轻这种混淆:
auto p = std::make_pair(1, container);
考虑使用std::vector<std::string>
而不是C风格的数组。