Проблема. См. Ниже код ... Мне не хватает инструкции 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;
}
Может быть, потому что не было ничего, чего Конкретизация этого шаблона? –
У вас есть [предупреждения поднялись высоко] (http://stackoverflow.com/a/399865/168175)? – Flexo
@pwny - Довольно уверен, что я копировал шаблон в порядке, но я добавил функцию 'innerTest', чтобы удалить это из рассмотрения. @Flexo - У меня не было. Я включил его в W4. Невозможно использовать WX из-за кода библиотеки. Даже на W4 нет упоминания о недостающем возвращении. – Dennis