make_shared создать std :: shared_ptr? gcc 4.6.2 - PullRequest
1 голос
/ 06 декабря 2011

я использую gcc 4.6.2.

Я пытаюсь push_back в векторе shared_ptr.

Но gcc выдает мне каждый раз ошибку.

Здесьмои коды:

std::vector< std::tr1::shared_ptr<Process> > procs;
std::string line;
while (getline(file, line) && line.find(JobMask) != std::string::npos)
{
    std::string procName                      = line.substr(line.find(JobMask) + JobMask.size());
    std::vector<Instruction> procInstructions = extractProgram(file);
    std::queue<int>          procInputs       = extractInputs(file);

    if (!procInstructions.empty())
        procs.push_back(std::make_shared<Process>(Process(procName, procInputs, procInstructions))); //line 51
}
return procs;

Ошибка, которую дает мой gcc:

Process.cpp: In static member function 'static std::vector<std::tr1::shared_ptr<RMMIX::Process> > RMMIX::Process::createProcesses(const string&)':

Process.cpp:51:95: error: no matching function for call to 'std::vector<std::tr1::shared_ptr<RMMIX::Process> >::push_back(std::shared_ptr<RMMIX::Process>)'

Process.cpp:51:95: note: candidates are:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.2/include/g++-v4/bits/stl_vector.h:826:7: note: void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = std::tr1::shared_ptr<RMMIX::Process>, _Alloc = std::allocator<std::tr1::shared_ptr<RMMIX::Process> >, std::vector<_Tp, _Alloc>::value_type = std::tr1::shared_ptr<RMMIX::Process>]
/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.2/include/g++-v4/bits/stl_vector.h:826:7: note:   no known conversion for argument 1 from 'std::shared_ptr<RMMIX::Process>' to 'const value_type& {aka const std::tr1::shared_ptr<RMMIX::Process>&}'
/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.2/include/g++-v4/bits/stl_vector.h:839:7: note: void std::vector<_Tp, _Alloc>::push_back(std::vector<_Tp, _Alloc>::value_type&&) [with _Tp = std::tr1::shared_ptr<RMMIX::Process>, _Alloc = std::allocator<std::tr1::shared_ptr<RMMIX::Process> >, std::vector<_Tp, _Alloc>::value_type = std::tr1::shared_ptr<RMMIX::Process>]
/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.2/include/g++-v4/bits/stl_vector.h:839:7: note:   no known conversion for argument 1 from 'std::shared_ptr<RMMIX::Process>' to 'std::vector<std::tr1::shared_ptr<RMMIX::Process> >::value_type&& {aka std::tr1::shared_ptr<RMMIX::Process>&&}'

На мой взгляд, ошибка говорит о том, что std :: make_shared создает std :: shared_ptr.
Но в gcc shared_ptr находится в пространстве имен std :: tr1.
Как я могу это исправить?

Ответы [ 2 ]

9 голосов
/ 06 декабря 2011

Если я правильно понимаю, make_shared является новым в C ++ 11 и находится в пространстве имен std, но оно доступно, только если вы компилируете с -std=gnu++0x или подобным.Но если вы это сделаете, то shared_ptr также находится в std.

Проблема в том, что есть другая версия shared_ptr в std::tr1, но в режиме C ++ 11 вы не должныиспользуйте его: его следует считать устаревшим .

Ваше решение состоит в том, чтобы просто исключить каждое использование tr1 и использовать полную версию C ++ 11 этих классов.

3 голосов
/ 06 декабря 2011

Сообщение об ошибке шаблона C ++ может быть чудовищным для чтения Но ответ в 2-й записке.

no known conversion for argument 1 from 'std::shared_ptr<RMMIX::Process>' to 'const value_type& {aka const std::tr1::shared_ptr<RMMIX::Process>&}'

Проблема в том, что вы используете std::make_shared (который создает std::shared_ptr) и передаете его в вектор std::tr1::shared_ptr.

Самое простое решение - сбросить TR1. Материал из TR1 был одной из первых функций, реализованных компиляторами при добавлении поддержки C ++ 11.

std::vector< std::shared_ptr<Process> > procs;

Если вы не можете прекратить использование std::tr1::shared_ptr. Вам придется отказаться от использования make_shared, поскольку оно не было частью TR1.

...