Ose*_*Ose 3 c++ generic-programming function-templates class-template
假设我template<int I> void ft()在结构模板中有一个静态函数模板template<bool B> S,我想ft从另一个函数模板调用template<bool B> void g(),将bool模板参数传递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;
}
Run Code Online (Sandbox Code Playgroud)
在GCC 4.5.2中进行编译会给出关于该行的两个错误S<B>::ft<12>():
Comeau(http://www.comeaucomputing.com/tryitout/),在严格的C++ 03模式下,也抱怨该行,说明"预期的表达式",在右括号下面有一个插入符号.S<B>::f()然而,编译器都没有抱怨该行,而且Comeau实际上可以在轻松模式下编译整个最小示例.
如果我删除了g模板,而是像这样实例化S模板参数g:
void g() {
S<true>::ft<12>();
}
int main() {
g();
...
Run Code Online (Sandbox Code Playgroud)
GCC成功编译它,Comeau在严格的C++ 03模式下也是如此.
从GCC上面的第二个错误来看,似乎在解释中存在歧义S<B>::ft<12>,好像它认为我试图测试是否S<B>::ft小于12.我知道使用typename来解决在提到时出现的歧义依赖范围内的类型.当依赖范围中出现的东西是函数而不是类型时,是否有人知道如何解决歧义?
您需要帮助编译器一点,告诉它ft是一个模板,如下所示:
template<bool B>
struct S {
static void f() {
}
template<int I>
static void ft() {
}
};
template<bool B>
void g() {
S<B>::f();
S<B>::template ft<12>();
}
int main() {
g<true>();
return 0;
}
Run Code Online (Sandbox Code Playgroud)