std :: vector :: resize в gcc4.2 - PullRequest
       11

std :: vector :: resize в gcc4.2

0 голосов
/ 29 февраля 2012

неделю назад я обновился с gcc4.0 до llvm gcc4.2. все прошло хорошо, за исключением одной вещи, которую мне действительно трудно выяснить, потому что я больше похож на парня, который обрабатывает аудиосигналы. так что я очень надеюсь, что кто-то из вас сможет мне помочь. Моя проблема в том, что использование :: resize в stl_vector.h полностью изменилось.

в gcc4.0 прекрасно скомпилирован следующий код:

std::vector< std::vector<myData> >  mMy;

std::for_each( mMy.begin(), mMy.end(), 
  std::bind2nd(std::mem_fun_ref(&std::vector<myData>::resize), numMy) );

в gcc4.2 не компилируется с ошибкой:

нет соответствующей функции для вызова mem_fun_ref ..

Я почти уверен, что не знаю, как правильно реализовать :: изменение размера, может кто-нибудь сказать мне, что я должен сделать, чтобы это исправить. я рад, если вы покажете мне правильный пример кода, но советы (книги) и ключевые слова, которые могли бы помочь мне понять это, также были бы очень благодарны ..

большое спасибо за вашу помощь ..

С уважением, BZT

Ответы [ 3 ]

3 голосов
/ 29 февраля 2012

Убедитесь, что у вас есть

#include <functional>

в вашем комплекте.

Однако вам будет проще это сделать (если вы пытаетесь установить размер всех векторов myData.

std::vector<std::vector<myData > > mMy (size, std::vector(numMy) );

Здесь каждый вектор будет размером numMy

Также вы знаете, что gcc 4.2 все еще очень стар, если вы можете, я очень рекомендую gcc 4.6.

с помощью gcc 4.6 вы можете избавиться от всего этого mem_func, независимо от всего этого:

std::for_each( mMy.begin(), mMy.end(), 
    std::bind(std::vector<myData>::resize, std::placeholders::_1, numMy));

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

0 голосов
/ 29 февраля 2012

111111 имеет правильный ответ, но я хотел объяснить, что, по моему мнению, здесь происходит.

Я считаю, что код на самом деле не является допустимым, потому что std :: vector :: resize - перегруженная функцияВы должны разыграть &std::vector<myData>::resize, чтобы выбрать желаемую перегрузку:

std::for_each( mMy.begin(), mMy.end(), 
  std::bind2nd(std::mem_fun_ref(
    reinterpret_cast<void (std::vector<myData>::*)(std::size_t)>(&std::vector<myData>::resize)),
    numMy));
0 голосов
/ 29 февраля 2012

mem_fun_ref принимает функцию-член с нулевым или одним аргументом.

Я подозреваю, что ваш код скомпилируется, если вы попробуете эту технику с «резервом», который принимает один аргумент (но не меняет размер.)1003 *

resize хочет два аргумента: размер и инициализатор (который имеет значение по умолчанию).Я думаю, именно поэтому нет соответствующего шаблона mem_fun_ref - он запутан необязательным инициализатором.

Может быть, ваш gcc 4.0 работал без проблем, а gcc 4.2 нет?

Я тестировал наRH5 Linux Linux GCC 4.1.2 (нет соответствия для mem_fun_ref) и RH6 Linux Linux GCC 4.4.5 (не найдено соответствие), поэтому, возможно, вам следует перейти вперед.

...