【发布时间】:2012-04-09 22:01:40
【问题描述】:
假设我在结构模板template<bool B> S 中有一个静态函数模板template<int I> void ft(),我想从另一个函数模板template<bool B> void g() 调用ft,将布尔模板参数从g 传递给S :
template<bool B>
struct S {
static void f() {
}
template<int I>
static void ft() {
}
};
template<bool B>
void g() {
S<B>::f();
S<B>::ft<12>();
}
int main() {
g<true>();
return 0;
}
在 GCC 4.5.2 中编译它会产生关于 S<B>::ft<12>() 行的两个错误:
- ')' 标记之前的预期主表达式
- “”和“int”类型的无效操作数转为二进制“运算符”
Comeau (http://www.comeaucomputing.com/tryitout/),在严格的 C++03 模式下,也抱怨该行,声明 “期望一个表达式”,在右括号下方带有一个插入符号。然而,这两个编译器都没有抱怨 S<B>::f() 行,而 Comeau 实际上可以在轻松模式下编译整个最小示例。
如果我删除g 的模板,而是像这样在g 中实例化S 的模板参数:
void g() {
S<true>::ft<12>();
}
int main() {
g();
...
GCC 成功编译它,Comeau 在严格的 C++03 模式下也是如此。
从上面GCC的第二个错误来看,似乎S<B>::ft<12>的解释有歧义,好像它认为我在尝试测试S<B>::ft是否小于12。我知道使用typename 解决在引用依赖范围内的类型时出现的歧义。当出现在依赖范围中的事物是函数而不是类型时,有谁知道如何解决歧义?
【问题讨论】:
-
需要更多
template: stackoverflow.com/questions/610245/… -
谢谢,您链接到的帖子内容丰富!
标签: c++ generic-programming function-templates class-template