template<int I> void ft()
假设我在结构模板中有一个静态函数模板template<bool B> S
,并且我想ft
从另一个函数模板调用template<bool B> void g()
,将 bool 模板参数从g
to传递给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
来解决在提及时出现的歧义依赖范围内的类型。当出现在依赖范围中的事物是函数而不是类型时,有谁知道如何解决歧义?