template<int I> void ft()假设我在结构模板中有一个静态函数模板template<bool B> S,并且我想ft从另一个函数模板调用template<bool B> void g(),将 bool 模板参数从gto传递给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'类型的无效操作数到二进制'operator<'
Comeau ( http://www.comeaucomputing.com/tryitout/ ),在严格的 C++03 模式下,也抱怨该行,指出"expected an expression",在右括号下方有一个插入符号。然而,这两个编译器都没有抱怨这条线S<B>::f(),Comeau 实际上可以在轻松模式下编译整个最小示例。
如果我删除g的模板,而是像这样实例化S的模板参数g:
void g() {
S<true>::ft<12>();
}
int main() {
g();
...
GCC 成功地编译了它,Comeau 在严格的 C++03 模式下也是如此。
从上面 GCC 的第二个错误来看,似乎对 的解释存在歧义S<B>::ft<12>,好像它认为我正在尝试测试是否S<B>::ft小于 12。我知道使用typename来解决在提及时出现的歧义依赖范围内的类型。当出现在依赖范围中的事物是函数而不是类型时,有谁知道如何解决歧义?