模板和typename

时间:2012-12-21 13:00:22

标签: c++ templates

使用错误消息编译以下代码:

    @> 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访问静态成员;将是oK!

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,如何解决? 谢谢!

3 个答案:

答案 0 :(得分:3)

typename SelectColumn<E>::SELECT_COLS COL;

是变量声明,而不是类型。 (变量的名称为COL,类型为typename SelectColumn<E>::SELECT_COLS

也许你想说

typedef typename SelectColumn<E>::SELECT_COLS COL;

答案 1 :(得分:1)

typename SelectColumn<E>::SELECT_COLS COL;
这里使用的

typename不是使COL成为SelectColumn<E>::SELECT_COLS的别名的语法,而是告诉解析器标识符SELECT_COLS是一个类型而不是一个变量点。

 str_a = COL::columns;

您在此行收到错误的原因是您尝试使用错误的语法访问COL对象的成员数据。

答案 2 :(得分:0)

COL是一个对象,而不是一个类型,因此你必须说COL.columns来加入它的成员。