-3

以下代码编译时带有错误消息:

    @> 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 回答