2015-02-06 5 views
1

Я следующий кодC++ make_pair нет функции соответствия не найдено

 #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

не должно быть 'std :: make_pair'? – Borgleader

+5

Скажите это со мной: массив не является указателем. – aschepler

+2

О, пожалуйста, не используйте VLA .. используйте вектор и прекратите использование смесей указателей/массивов, и у вас не будет проблем – stefan

ответ

3

Ваша проблема в два раза. Во-первых, размеры статически распределенного массива должны быть константами времени компиляции. Массивы переменной длины (VLAs) являются нестандартными, но поддерживаются некоторыми компиляторами в качестве расширений. Я бы держался подальше от них, чтобы поддерживать стандартную совместимость и переносимость программы.

Создание a и bconst должно хватить:

int const a = 5; 
int const b = 10; 
char container[a][b]; 

Далее, тип p не соответствует типу возвращаемого из make_pair(1, container). Внутренне, make_pair «разлагает» выведенный тип аргументов (в этом случае применяется преобразование массива в указатель). Затухающий тип второго аргумента 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- стиль массивов.

+0

На самом деле, в этом случае VLA также вызывают ошибку make_pair - это не ошибка преобразования. – Barry

Смежные вопросы