-3

次のコードはエラーmsgでコンパイルされています。

    @> g++ test.cpp
    test.cpp: In member function 'void testit<E>::print()':
    test.cpp:79: error: 'COL' is not a class or namespace
    test.cpp:83: error: expected `;' before 'b2'

COL::columnsを使用する場合; 静的メンバーにアクセスするには、正常にコンパイルされません。代わりに、SelectColumn :: SELECT_COLS::columnsで静的メンバーにアクセスします。大丈夫だろう!

struct AllColumns
{
    static const char columns[];
};
const char AllColumns::columns[] = "*";

struct MemoryColumns
{
    static const char columns[];
};
const char MemoryColumns::columns[] = "data,data_expire_time";

template<typename E>
struct SelectColumn
{
public:
    typedef unsigned BIGT;
    typedef AllColumns SELECT_COLS;
};

template<>
struct SelectColumn<int>
{
public:
    typedef int BIGT;
    typedef MemoryColumns SELECT_COLS;
};

template<typename E>
class testit
{
public:
    typename SelectColumn<E>::SELECT_COLS COL;
    typename SelectColumn<E>::BIGT BIG;

    void print()
    {
      string str_a = COL::columns; //compile error here!
      string str_b = SelectColumn<E>::SELECT_COLS::columns; // OK

      BIG b2 = 10; //compile error here!
              typename SelectColumn<E>::BIGT b = 12; // OK
    }
};

COL :: columnsを使用したい場合の修正方法は?ありがとう!

4

3 に答える 3

3
typename SelectColumn<E>::SELECT_COLS COL;

は変数宣言であり、型ではありません。(変数の名前はCOL、タイプはtypename SelectColumn<E>::SELECT_COLS

おそらくあなたは言うつもりだった

typedef typename SelectColumn<E>::SELECT_COLS COL;
于 2012-12-21T13:02:35.110 に答える
1
typename SelectColumn<E>::SELECT_COLS COL;

typenameここで使用されているのはCOL、のエイリアスを作成するための構文ではなく、識別子が変数ではなく型であるSelectColumn<E>::SELECT_COLSことをパーサーに通知するためです。SELECT_COLS

 str_a = COL::columns;

この行でエラーが発生した理由は、COL間違った構文を使用してオブジェクトのメンバーデータにアクセスしようとしているためです。

于 2012-12-21T13:29:57.357 に答える
0

COLはオブジェクトであり、タイプではありませんCOL.columns。そのため、そのメンバーにアクセスするために言わなければなりません。

于 2012-12-21T13:02:55.940 に答える