模板和类型名称

Template and typename

本文关键字:类型      更新时间:2023-10-16

编译以下代码时出现错误消息:

    @> 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::列;若要访问静态成员,它将无法成功编译。相反,通过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::列,如何修复它?谢谢

typename SelectColumn<E>::SELECT_COLS COL;

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

也许你想说

typedef typename SelectColumn<E>::SELECT_COLS COL;
typename SelectColumn<E>::SELECT_COLS COL;

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

 str_a = COL::columns;

这一行出现错误的原因是,您试图使用错误的语法访问COL对象的成员数据。

COL是一个对象,而不是一个类型,因此您必须说COL.columns才能访问它的成员。