假设我有一个结构模板template<bool B> S
内的静态函数模板template<int I> void ft()
,我想打电话给ft
从另一个函数模板template<bool B> void g()
,从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' 为二进制 '运算符<'
科莫(http://www.comeaucomputing.com/tryitout/)的无效操作数基本表达式,在严格C++ 03模式,也对该行抱怨,指出“预计表达式”,在右圆括号下方插入一个插入符号。然而,编译器都不会抱怨S<B>::f()
这行,并且Comeau实际上可以在放松模式下编译整个最小示例。
如果我删除g
的模板,而是实例S
的模板参数g
像这样:
void g() {
S<true>::ft<12>();
}
int main() {
g();
...
GCC编译成功了,如严格C++ 03模式确实科莫。
从GCC的上述第二个错误,它似乎有在S<B>::ft<12>
解释歧义,如果它认为我想要测试是否S<B>::ft
小于12.我知道使用typename
来作为解决引用依赖范围内的类型时出现的歧义。有没有人知道如何解决出现在依赖范围内的东西是函数而不是类型时的歧义?
需要更多'template':http://stackoverflow.com/questions/610245/where - 为什么 - 我必须把模板和类型名称关键字 – 2012-03-26 11:47:54
谢谢,您链接到的帖子是非常翔实的! – Ose 2012-03-26 12:23:04