3

假设我有一个结构模板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>()两个错误:预期

  1. 之前 ')' 令牌
  2. 类型 '<悬而未决重载的函数类型>' 和 '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来作为解决引用依赖范围内的类型时出现的歧义。有没有人知道如何解决出现在依赖范围内的东西是函数而不是类型时的歧义?

+1

需要更多'template':http://stackoverflow.com/questions/610245/where - 为什么 - 我必须把模板和类型名称关键字 – 2012-03-26 11:47:54

+0

谢谢,您链接到的帖子是非常翔实的! – Ose 2012-03-26 12:23:04

回答

6

您需要帮助编译了一下,以告诉它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; 
} 
+0

奇妙的是,这个伎俩!我刚刚注意到,Stroustrup的C++编程语言手册中的C.13.6“模板作为限定符”部分描述了同样的事情。谢谢你的帮助! – Ose 2012-03-26 12:01:56