使用VS2010和boost :: posix_time编译问题

时间:2013-02-07 14:47:13

标签: visual-studio-2010 boost

我遇到了一个让我发疯的问题。我使用followin timer entry结构实现了一个计时器:

typedef std::multimap<boost::posix_time::ptime, events::ITimeout*> TEntryMap;
TEntryMap entries_;

我将元素插入到multimap中:

boost::posix_time::ptime tTimeout = boost::posix_time::microsec_clock::local_time() + boost::posix_time::milliseconds(timeout);
entries_.insert(std::make_pair(tTimeout, ptr)); // ptr is the events::ITimeout object

并在一个翻译单元(cpp文件)中完美运行。但是,现在我需要将此功能移动到另一个cpp文件,现在我收到编译错误:

1>Build started 2013-02-07 15:38:18.
1>ClCompile:
1>  EventDispatcher.cpp
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(260): error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const boost::posix_time::ptime' (or there is no acceptable conversion)
1>          ....\boost\boost\date_time\posix_time\ptime.hpp(57): could be 'boost::posix_time::ptime &boost::posix_time::ptime::operator =(const boost::posix_time::ptime &)'
1>          while trying to match the argument list '(const boost::posix_time::ptime, const boost::posix_time::ptime)'
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(259) : while compiling class template member function 'std::pair<_Ty1,_Ty2> &std::pair<_Ty1,_Ty2>::operator =(std::pair<_Ty1,_Ty2> &&)'
1>          with
1>          [
1>              _Ty1=const boost::posix_time::ptime,
1>              _Ty2=events::ITimeout *
1>          ]
1>          ....\eventdispatcher.cpp(72) : see reference to class template instantiation 'std::pair<_Ty1,_Ty2>' being compiled
1>          with
1>          [
1>              _Ty1=const boost::posix_time::ptime,
1>              _Ty2=events::ITimeout *
1>          ]
1>

我很无能,并且在这2小时内一直在努力。我认为工作实施和非工作实施之间没有区别。相同的构造,相同的multimap,相同的包括,相同的一切! ;(

1 个答案:

答案 0 :(得分:0)

我找到了问题的原因,它闻起来像VS2010 C ++编译器错误(当使用std :: remove_if时)。在稍后使用构造的类中的函数实现中,我尝试使用以下命令删除地图中的元素:

void removeEntry(events::ITimeout* p)
{
    std::remove_if(entries_.begin(), entries_.end(),
        [&](TEntryMap::value_type& entry)->bool
        { 
             return (entry.second == p);
        }
    );
}

将该代码更改为:

void removeEntry(events::ITimeout* p)
{
    TEntryMap::iterator it = std::find_if(entries_.begin(), entries_.end(),
        [&](TEntryMap::value_type& entry)->bool
        { 
             return (entry.second == p);
        }
    );
    if (it != entries_.end()) entries_.erase(it);
}

使插入代码有效。去搞清楚。请注意,即使我使用基于结构的谓词而不是lambda闭包,它仍然不能用于std :: remove_if ......