3

これを調べてみましたが、自分の状況に合った解決策を見つけることができました。

だから私はmysqlフィールドのメタデータの基本的なラッパーを作ろうとしています:

#pragma once

#include <string>
#include <stdint.h>
#include <windows.h>
#include "mysql.h"


namespace escobar { namespace storage {

    class mysql_field_metadata
    {
    private:
        uint32_t result_index;          /* For indexing the field for a mysql record. */
        std::string name;               /* The name of the column. */
        std::string original_name;      /* The original name of the column, if the name is an alias. */
        std::string table;              /* Name of the table */
        std::string original_table;     /* The original name of the table, if the table name is an alias. */
        std::string database;           /* The name of the database the table/record belongs to. */
        uint32_t length;                /* The length of the field. */
        uint32_t max_length;            /* The maximum length of the set. */
        uint32_t decimals;              /* Number of decimals used in the field. */
        uint32_t charset;               /* Table charset. */
        enum enum_field_types type;     /* The type of MYSQL data. */

    public:
        mysql_field_metadata(MYSQL_FIELD* field_data, uint32_t _result_index) : 
            result_index(_result_index), name(field_data->name),
            original_name(field_data->org_name), table(field_data->table),
            original_table(field_data->org_table), database(field_data->db),
            length(field_data->length), max_length(field_data->max_length),
            decimals(field_data->decimals), charset(field_data->charsetnr),
            type(field_data->type)
        {
        }

        ~mysql_field_metadata(void) { }
        std::string get_name(void) { return this->name; }
        std::string get_original_name(void) { return this->original_name; }
        std::string get_table(void) { return this->original_name; }
        std::string get_original_table(void) { return this->original_table; }
        std::string get_database(void) { return this->database; }
        uint32_t get_length(void) { return this->length; }
        uint32_t get_max_length(void) { return this->max_length; }
        uint32_t get_decimals(void) { return this->decimals; }
        uint32_t get_charset(void) { return this->charset; }
        enum emum_field_types get_type(void) { return this->type; }
    };

}}

ご覧のとおり、私の最後の関数は次のとおりです。

enum emum_field_types get_type(void) { return this->type; }

動作していないようです。次のエラーが発生します。

error C2440: 'return' : cannot convert from 'enum_field_types' to 'escobar::storage::emum_field_types' 1> Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)

4

2 に答える 2

5

プレフィックスを付ける必要はありませenum。関数とメンバーの両方から削除して、レポートを返すことができます。コンパイラを混乱させる可能性があります。

enum_field_types type;     /* The type of MYSQL data. */
...
emum_field_types get_type(void) {

編集:「識別子が宣言されていない」問題を修正するには、名前空間にある場合、または名前空間がない場合namespace::typenameに構文を使用します::typename

于 2012-12-21T02:44:42.327 に答える
0

コンパイラエラーから、。には2つの異なる宣言があるようですenum_field_types。おそらく、1つは名前空間内にあり、もう1つはグローバルです。2つの可能な解決策があります:

  1. 両方の宣言が独自のコードに含まれている場合は、これらの宣言の両方を追跡して、そのうちの1つを削除できます。

  2. namespace::typename構文で使用する宣言を修飾できます。

2つの異なる宣言に同じ名前を使用すると、特にそれらの宣言の1つがグローバル名前空間にある場合、微妙なバグやコンパイラエラーが発生する可能性があるため、選択肢1をお勧めします。

于 2012-12-21T19:57:38.077 に答える