1

問題。 以下のコードを参照してください...return field;ステートメントが欠落しており、いくつかのデバッグ実行でそれを見つけられませんでした。そのようなものがエラーなしでコンパイラを通過するとは思いもしませんでした! なぜそれをしたのですか?

説明std::tr1::function構築時に変換アルゴリズムを受け取るために 使用するパーサー オブジェクトがあります。変換は、文字列から、さまざまな型を保持できるTransportableMessageで構成されるtype のオブジェクトに変換しTMFieldsます。フィールドのタイプは (XML からの) 文字列に基づいているため、フィールドを作成するためのファクトリ関数を作成しました。

tstringオブジェクトはに基づいた型キャストでありUNICODE、基本的に at the minutes に解決さstd::wstringれます。また、私は VS2008 を使用していないため、アップグレードを容易にし、発生する可能性を高めるために背後にunique_ptr隠れています。std::auto_ptrScopedPtr_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問題が s 固有のものかどうかを確認する関数を導入しましたscoped_ptrが、そうではないようです。GCCでも使用internalTestしてみましたが、エラーが返されました。Visual Studio がこれにフラグを立てなかったのはなぜですか? オンにできるコンパイル設定がどこかにありませんか? 標準はこれを許可していますか?これがよく知られていることである場合はお詫びします。Google で検索して、ここで回答を探します。

編集::コードの呼び出し- より多くのコンテキストのためにこれを追加するだけです。

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;
}
4

1 に答える 1

5

何かを返さずに関数の本体から外れることはエラーではなく、未定義の動作です。6.3.3returnステートメント [stmt.return] §3を参照してください。

関数の最後を流れることは、値を持たない戻りと同じです。これにより、値を返す関数で未定義の動作が発生します。

于 2012-08-07T18:17:33.203 に答える