c++ - std::make_pair 与 c++ 11

标签 c++ c++11 gcc boost raspberry-pi

您好,我有以下代码:

bool PinManager::insertPin(const std::string& p_pinNumber, const std::string& p_mode)
{
    boost::shared_ptr<GPIOPin> pin(new GPIOPin(p_pinNumber, p_mode));
    if (pin)
    {
        m_pinsInUse.insert(std::make_pair<std::string, boost::shared_ptr<GPIOPin> >(p_pinNumber, pin));
        return true;
    }
    return false;
}

此代码始终编译,但当我添加 -std=c++0x 标志时,此代码无法编译并显示消息:

[ 42%] Building CXX object gpioaccess/CMakeFiles/gpioaccess.dir/pinmanager/pinmanager.cpp.o
/home/pi/robot_2.0/trunk/gpioaccess/pinmanager/pinmanager.cpp: In member function 'bool gpioaccess::PinManager::insertPin(const string&, const string&)':
/home/pi/robot_2.0/trunk/gpioaccess/pinmanager/pinmanager.cpp:39:101: error: no matching function for call to 'make_pair(const string&, boost::shared_ptr<gpioaccess::GPIOPin>&)'
/home/pi/robot_2.0/trunk/gpioaccess/pinmanager/pinmanager.cpp:39:101: note: candidate is:
/usr/include/c++/4.6/bits/stl_pair.h:262:5: note: template<class _T1, class _T2> std::pair<typename std::__decay_and_strip<_T1>::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&)
gpioaccess/CMakeFiles/gpioaccess.dir/build.make:77: recipe for target 'gpioaccess/CMakeFiles/gpioaccess.dir/pinmanager/pinmanager.cpp.o' failed
make[2]: *** [gpioaccess/CMakeFiles/gpioaccess.dir/pinmanager/pinmanager.cpp.o] Error 1
CMakeFiles/Makefile2:75: recipe for target 'gpioaccess/CMakeFiles/gpioaccess.dir/all' failed
make[1]: *** [gpioaccess/CMakeFiles/gpioaccess.dir/all] Error 2
Makefile:75: recipe for target 'all' failed
make: *** [all] Error 2

经过一番挖掘,我发现之前编译的这个事实可能是一个错误;但是,我仍然不确定如何解决这个问题。有没有人在正确的方向上有任何要点?

gcc --versiongcc (Debian 4.6.3-14+rpi1) 4.6.3

最佳答案

std::make_pair 之间发生了变化和 .

,它通过转发引用而不是通过值接受参数。这意味着通过显式指定其类型模板参数,您最终会得到以下实例化:

std::make_pair<std::string , boost::shared_ptr<GPIOPin> >
             (std::string&&, boost::shared_ptr<GPIOPin>&&);

期望右值 引用,它不能绑定(bind)到左值。

您不应明确指定 std::make_pair 的类型模板参数。相反,您应该让编译器自行推导它们:

std::make_pair(p_pinNumber, pin)

此外,由于 ,当使用 std::map 时,您可以就地构造对:

m_pinsInUse.emplace(p_pinNumber, pin);

您可以利用类模板参数推导,并在不指定类模板参数的情况下构造 std::pair:

std::pair(p_pinNumber, pin)

关于c++ - std::make_pair 与 c++ 11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32443181/

相关文章:

c++ - 特化成员模板而不特化其父模板

c++ - 如何使用函数的输出初始化 const 数组结构字段?

c++ - vector 之间的交集

C++ : display a bar chart of array data using *

c++ - 错误 : inlining failed to call always_inline

gcc - 当我配置 ctags-5.8 时有未声明的标识错误

C++-分词器极慢

c++ - SFML RenderWindow 奇数字符

C++ 解决虚拟模板方法

c - 为数的质因数找到更好的算法