2012-08-07 5 views
1

Проблема. См. Ниже код ... Мне не хватает инструкции return field; и не нашел его для нескольких отладочных запусков. Я бы никогда не подумал, что что-то подобное прошло бы мимо компилятора без ошибок! Почему?Visual Studio - Ошибка компиляции при возврате значения

Описание У меня есть объект синтаксического анализатора, который использует std::tr1::function, чтобы получить алгоритм перевода на строительство. Перевод преобразуется из строки в объект типа TransportableMessage, который состоит из TMFields, который может содержать разные типы. Так или иначе, я создал фабричную функцию для создания полей, потому что тип поля основан на строке (из XML), а пока есть только несколько, может быть, что в будущем их будет больше.

Объект tstring - это тип на основе UNICODE и в основном разрешает std::wstring в данный момент. Также потому, что я использую VS2008 unique_ptr, нет, поэтому я скрыл std::auto_ptr позади ScopedPtr_t, чтобы сделать обновление проще и, следовательно, более вероятно, произойдет.

namespace arc 
{ 
    namespace util 
    { 

     int internalTest() 
     { 
      std::cout << "Any error?" << std::endl; 
     } 

     ScopedPtr_T<TMField> TmFieldFactory(const tstring& name, const tstring& typeName, const tstring& value) 
     { 
      ScopedPtr_T<TMField> field; 
      int a = internalTest(); 
      if(typeName == _T("int") || typeName == _T("long")) 
      { 
       field.reset(new TMNumericField(name, boost::lexical_cast<__int64>(value))); 
      } 
      else if(typeName == _T("string")) 
      { 
       field.reset(new TMStringField(name, value)); 
      } 
      else if(typeName == _T("timestamp")) 
      { 
       field.reset(new TMTimeField(name, boost::lexical_cast<__int64>(value))); 
      } 
      else 
      { 
       std::string info(__FILE__ " :: " __FUNCTION__ " : Unrecognized TmField type "); 
       std::string type(typeName.begin(), typeName.end()); 
       info += type; 
       throw ARC_Exception(info.c_str()); 
      } 
      return field; // I WAS MISSING THIS! 
     } 
    } 
} 

В принципе, я хотел бы знать, были ли у кого-то еще проблемы с этим? Я ввел функцию internalTest, чтобы узнать, была ли проблема конкретной для scoped_ptr с, но, похоже, это не так. Я также попытался использовать internalTest в GCC, и он возвратил ошибку. Почему Visual Studio не отметили это? Я где-то пропустил настройку компиляции, чтобы включить? Позволяет ли это стандарт? Извиняюсь, если это что-то хорошо известно, я сделал google и ища ответы здесь.

EDIT :: Calling Code - Просто добавьте это для большего контекста.

SharedPtr_T<TransportableMessage> strToTmConvFunc_Default_Apc7_0(const std::string& tm_str) 
{ 
    pugi::xml_document xmlDoc; 
    if(false == xmlDoc.load(tm_str.c_str())) 
    { 
     ARC_LOG(LOG_WARN, "The passed TM object was malformed. %s", tm_str.c_str()); 
     throw ARC_Exception("Malformed Transportable Message XML"); 
    } 

    pugi::xml_node tmBase = xmlDoc.first_child(); 
    std::string xmlRootName(tmBase.name()); 
    if(xmlRootName.compare("TM") != 0) 
    { 
     ARC_LOG(LOG_WARN, "The passed TM object was malformed. %s", tm_str.c_str()); 
     throw ARC_Exception("Malformed Transportable Message XML"); 
    } 

    std::string tmname = tmBase.child("N").child_value(); 
    std::string entity = tmBase.child("E").child_value(); 
    ARC_LOG(LOG_INFO, "TM message received for parsing. TM name is %s", tmname.c_str()); 

    tstring t_tmname(tmname.begin(), tmname.end()); 
    SharedPtr_T<TransportableMessage> tm_obj(new TransportableMessage(t_tmname, 0)); 

    pugi::xml_node fields = tmBase.child("FS"); 
    for(pugi::xml_node field = fields.first_child(); field; field = field.next_sibling("field")) 
    { 
     tm_obj->addField(arc::util::TmFieldFactory(field.child_value("N"), field.child_value("T"), field.child_value("V"))); 
    } 

    return tm_obj; 
} 
+0

Может быть, потому что не было ничего, чего Конкретизация этого шаблона? –

+2

У вас есть [предупреждения поднялись высоко] (http://stackoverflow.com/a/399865/168175)? – Flexo

+0

@pwny - Довольно уверен, что я копировал шаблон в порядке, но я добавил функцию 'innerTest', чтобы удалить это из рассмотрения. @Flexo - У меня не было. Я включил его в W4. Невозможно использовать WX из-за кода библиотеки. Даже на W4 нет упоминания о недостающем возвращении. – Dennis

ответ

5

Снятие тела функции без возврата что-то не является ошибкой, это неопределенное поведение; см 6.3.3 return утверждение [stmt.return] § 3:

Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.

Смежные вопросы