Ошибка компиляции в Boost throw_exception.hpp - PullRequest
1 голос
/ 03 мая 2011

Я пытаюсь использовать lexical_cast Boost для моего проекта C ++, но сталкиваюсь с ошибками компиляции с использованием Visual Studio 2010 Professional.

Ошибка выглядит следующим образом:

1>  VLGUI_Frame.cpp
1>c:\users\dev\external\boost_1_46_1\boost\throw_exception.hpp(54): error C2143: syntax error : missing ')' before 'constant'
1>c:\users\dev\external\boost_1_46_1\boost\throw_exception.hpp(54): error C2143: syntax error : missing ';' before 'constant'
1>c:\users\dev\external\boost_1_46_1\boost\throw_exception.hpp(54): error C2988: unrecognizable template declaration/definition
1>c:\users\dev\external\boost_1_46_1\boost\throw_exception.hpp(54): error C2059: syntax error : 'constant'
1>c:\users\dev\external\boost_1_46_1\boost\throw_exception.hpp(54): error C2059: syntax error : ')'
1>c:\users\dev\external\boost_1_46_1\boost\throw_exception.hpp(72): error C2143: syntax error : missing ';' before '{'
1>c:\users\dev\external\boost_1_46_1\boost\throw_exception.hpp(72): error C2447: '{' : missing function header (old-style formal list?)
1>
1>Build FAILED.

иВот код, который использует lexical_cast (он не связан, но кто знает, что он может помочь)

#include "boost/lexical_cast.hpp"

...

std::string Frame::toString( )
{
    std::string str = "";

    try
    {
        str = VLString::combine( 12, 
                                 m_Name.c_str( ),
                                 " : Dimensions[",
                                 boost::lexical_cast< std::string >( m_Rect.width ).c_str( ),
                                 ",",
                                 boost::lexical_cast< std::string >( m_Rect.height ).c_str( ),
                                 "] : Loc[",
                                 boost::lexical_cast< std::string >( m_Rect.x ).c_str( ),
                                 ",",
                                 boost::lexical_cast< std::string >( m_Rect.y ).c_str( ),
                                 "] : NumChildren[",
                                 boost::lexical_cast< std::string >( m_Children.size( ) ).c_str( ), 
                                 "]" );
    }
    catch( boost::bad_lexical_cast & )
    {
        str = VLString::combine( 2,
                                 m_Name.c_str( ),
                                 " : lexical_cast failed" );
    }

    return str;
}

К сожалению, у меня недостаточно опыта с Boost, чтобы самостоятельно диагностировать эту проблему.Я выполнил обязательный Google без результатов.

Спасибо за любую помощь.

Ответы [ 2 ]

7 голосов
/ 03 мая 2011

Похоже, что фактическая ошибка лежит в заголовке до <boost/throw_exception.hpp>.Например, ваша единица перевода содержит что-то вроде

#include "myheader.hpp"
#include <boost/throw_exception.hpp>

//You translation-unit specific code in here

, где "myheader.hpp" содержит что-то вроде

class MyClass
{
    //Members
}    // <-- Note missing semicolon!

Вообще говоря, если вы даже не можете скомпилировать файл заголовка, и вы получаетеerror C2447: '{' : missing function header (old-style formal list?), вам обычно нужно проверять заголовок перед тем, где происходит ошибка.

Наконец, вы можете устранить эту проблему, используя стандартизированный порядок включения заголовка внутри каждой единицы перевода.Я обычно использую этот порядок:

  • Стандартные библиотеки C
  • Стандартные библиотеки C ++
  • Сторонние библиотеки C
  • Сторонние библиотеки C ++
  • Мои заголовки

Если вы используете этот порядок, ошибка будет отображаться в вашем собственном коде, если он существует, а не в недрах какого-либо стороннего заголовка, который вы не можете контролировать.

0 голосов
/ 22 января 2015

У меня была точно такая же ошибка, потому что кто-то решил, что было бы здорово создать макрос с именем throw_exception.

Это затем вызвало сбой сборки, если заголовок, содержащий этот #define, был когда-либо включен до заголовка повышения. Это потому что:

template<typename E> BOOST_ATTRIBUTE_NORETURN inline void throw_exception(E const & e)

Заменили бы "throw_exception" на макрос, создающий недопустимый код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...