2011-09-22 88 views
1

我正在使用rapidxml库。 它定义一个函数以这种方式来解析文件:C++:将const int传递给模板函数

template<int Flags> 
void parse(Ch *text) 

的LIB提供例如const int标志:

const int parse_declaration_node = 0x20; 

所以我在类中创建一个指向静态INT:

const int * parser_mode; 

而在类构造函数中,我将它赋值为:

parser_mode = &rapidxml::parse_declaration_node; 

然后,当我尝试使用此const int *作为模板参数解析功能:

tree->parse<parser_mode>(file->data()); 

我收到此错误信息:

error: ‘GpxSectionData::parser_mode’ cannot appear in a constant-expression

声明此休息似乎是正确的,因为:

tree->parse<0>(file->data()); 

不会产生编译错误...

你能告诉我我在这里失踪了吗? 谢谢!


多亏了我下面的解释可能会定义它的类: 所以我觉得是这样的:

class Myclass { 
static const int parser_mode; 
[...] 
} 
static const int Myclass::parser_mode = rapidxml::parse_declaration_node; 

回答

7

template<int Flags> void parse(Ch *text) ... const int * parser_mode;

你的模板需要一个int作为模板参数,但您传递给它一个int*。类型intint*是不一样的。

尝试tree->parse<rapidxml::parse_declaration_node>(file->data());

+4

还要注意的是,即使'* parser_mode'是不是编译时间常数表达式,所以他必须使用全名(如你演示)或者在构造函数 –

+0

之外实例化'static const int parser_mode = rapidxml :: parse_declaration_node;'好吧。如果我说模板参数需要在编译期间解决,我是否正确理解了这个问题?所以,即使我的'parser_mode'指向一个'const int',由于指针本身将在运行时定义,该对象不能被构建?所以,即使我使用'const int * const parser_mode',这在编译期间会失败吗? – Plouff

+0

@Rob:顺便说一句,我也意识到,尝试'parsermode'而不是'* parser_mode'是愚蠢的。带*号的错误信息更令人困惑,而且让我感到困惑。当你学习C++时,指针需要一点练习!谢谢你的解释。 – Plouff

1

不能使用变量模板参数的值。

相反,你可以模板参数添加标志到类

template<int Flags> 
class CClass { 
    //... 
}; 

并设置标志参数为类实例

CClass<rapidxml::parse_declaration_node> obj; 
+0

谢谢,也很高兴知道这一点。即使在我的情况下,它可能不是很容易使用(但你不知道!)。事实上,我可能需要随着时间的推移在课堂中添加其他常量变量。 – Plouff