2010-11-02 102 views
12

我试图找到有关用作消除歧义器的模板关键字的任何信息,但没有关于此的信息。可能我在搜索错误的关键字,但没有像.template或 - >模板标准。谷歌只显示来自不同论坛的海湾合作委员会问题,但没有真正解释它的用途。模板歧义消除器

这样的代码在第11行(GCC上)没有模板关键字的情况下编译失败,但我不太确定这是否符合标准。

template<typename B> 
struct S1 
{ 
    template<typename T> void test() {} 
}; 

template<typename T> 
struct S2 
{ 
    S2() 
    { 
     S1<T>().template test<int>(); 
    } 
}; 

int main() 
{ 
    S2<int>(); 
} 

所以我的问题是:为什么这里使用模板的关键字,什么样的模糊性是不存在该关键字,我在哪里可以阅读有关(我真的很感激链接到标准)。

谢谢。

+0

@Prasoon:我知道在哪里使用'template'-keyword是很多问题的答案,但我找不到任何问题直接询问它。 – 2010-11-02 11:26:20

+0

@ Space_C0wb0y:对不起,我删除了我以前的评论。 – 2010-11-02 11:28:19

+0

您可能也想阅读:http://stackoverflow.com/questions/3786360/confusing-template-error/3786726#3786726 – 2010-11-02 22:34:58

回答

8

简短的回答:因为标准是这样说的

ISO C++ 03 14.2/4

当一个成员模板专业化的名称后出现。或 - 在后缀表达式中,或者在限定id中的嵌套名称说明符之后,并且postfix-expression或qualified-id显式依赖于模板参数(14.6.2),则成员模板名称必须是由关键字模板作为前缀。 否则,该名称被假定为命名非模板

P.S:

没有额外的使用模板,编译器不知道后面的低于令牌(<)是不是真的“小于”,而是一个模板参数列表的开始。

+4

可能我需要改变我的PDF阅读软件:)在该文本之后有例子使用 - >模板,我的软件找不到。非常感谢。这就对了。 – confucius 2010-11-02 11:33:44