【问题标题】:make_shared create std::shared_ptr? gcc 4.6.2make_shared 创建 std::shared_ptr?海合会 4.6.2
【发布时间】:2011-12-06 10:41:18
【问题描述】:

我正在使用 gcc 4.6.2。

我正在尝试在一个向量 shared_ptr 中 push_back。

但是 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 中。
我该如何解决?

【问题讨论】:

  • std::make_shared&lt;T&gt;(x...) 等价于std::shared_ptr&lt;T&gt;(new T(x...))(没有不必要的引用计数),所以你应该调用std::make_shared&lt;Process&gt;(procName, procInputs, procInstructions)

标签: c++ c++11 shared-ptr gcc4 make-shared


【解决方案1】:

如果我理解正确,make_shared 是 C++11 中的新功能,位于命名空间 std 中,但只有在使用 -std=gnu++0x 或类似名称编译时才可用。但如果你这样做,那么shared_ptr 也在std 中。

问题是std::tr1 中有另一个版本的shared_ptr,但在 C++11 模式下你不应该使用它:它应该被视为已弃用

您的解决方案只是删除对tr1 的所有使用,并使用这些类的完整 C++11 版本。

【讨论】:

  • thx 很多 :) 我不知道我可以采取正常的功能。
【解决方案2】:

C++ 模板错误消息可能难以阅读。但答案在第二个注释中。

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 的一部分。

【讨论】:

  • 我在玩具项目中编写了自己的 make_shared,需要使用 tr1 库。这样做有什么陷阱吗?
  • make_shared 不仅仅是shared_ptr ctor 的包装器。它依赖于内部细节将元数据与类型放在一个分配中。您需要确保您的版本与两种实现兼容,不会在任何东西(编译器、编译器版本、星期几)之间移植。
  • 谢谢。我不希望兼容性到这些细节,只是在不总是使用最近发布的编译器时方便。
猜你喜欢
  • 1970-01-01
  • 2014-08-10
  • 2016-12-27
  • 2013-08-20
  • 2020-01-27
  • 2011-01-09
  • 2018-11-28
  • 2012-02-06
相关资源
最近更新 更多