Skip to content

[QUESTION] MSVC: INTERNAL COMPILER ERROR in combiation with boost::container and boost::movelib::unique_ptr #1149

Description

@antonic901

Hi! I hope you won't mid if I ask here but I am having some issues with old version of boost. More precisly it is 1.57.0. In short, I am developer of XBMC 4.0 which is backport of modern Kodi to Original Xbox from 2001 using official XDK which is C++98. Since C++98 is missing lot of modern C++11 features I found that boost has lot of them and I am using them as replacement for stuff like smart pointers, lambdas, container algorithms etc.

Problem which I am facing is related to unique_ptr. Kodi is using lot of std::unique_ptr which ofcourse is not available in C++98, so as replacement I am using boost::movelib::unique_ptr. It's working fine as long as it is not used in std containers like vector, set or map. Because there is no concept of move in C++98, having std::map<std::string, boost::movelib::unique_ptr> as return value of method will cause compiler error:

class 'boost::movelib::unique_ptr<T>' : no copy constructor available or copy constructor is declared 'explicit'

I have read somewhere that using vector, map or set from boost::container should fix that. But unfortunately for me, when I use boost::container::map<std::string, boost::movelib::unique_ptr> I get INTERNAL COMPILER ERROR:

Compiling...
SkinTimerManager.cpp
lib\boost\boost\intrusive\bstree_algorithms.hpp(620) : fatal error C1001: INTERNAL COMPILER ERROR
        (compiler file 'msc1.cpp', line 2701) 
         Please choose the Technical Support command on the Visual C++ 
         Help menu, or open the Technical Support help file for more information

However, I've found out using boost::unordered_map won't crash compiler. So I am wondering why and can I use that instead of normal map?

Here is source code of files:
SkinTimer.cpp
SkinTimerManager.cpp

One of method which is failing is CSkinTimerManager::TimerIsRunning:

bool CSkinTimerManager::TimerIsRunning(const std::string& timer) const
{
  boost::container::map<std::string, boost::movelib::unique_ptr<CSkinTimer> >::const_iterator iter = m_timers.find(timer);
  if (iter != m_timers.end())
  {
    return iter->second->IsRunning(); <-- this line failes
  }
  CLog::Log(LOGERROR, "Couldn't find Skin Timer with name: {}", timer);
  return false;
}

And sorry again if this is not a place to ask for a help :)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions