使用错误消息编译以下代码:
@> 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,如何解决? 谢谢!
答案 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
来加入它的成员。