为什么依赖模板名称没有关键字?

时间:2016-09-17 22:22:49

标签: c++ templates c++11 language-lawyer

我已经编写了一个模板func,它使用模板类的模板方法entry_func。在func,要致电template,我应该使用关键字template。在该示例中,行(1)不编译而行(2)不编译。到目前为止还好。

但是,如果我稍微更改一行(1)并获得第(3)行,那么第(3)行也会编译,而不会使用关键字#include <type_traits> template<class> struct Impl { template<class T> static T func(T t) { static_assert(sizeof(T)>=0, "Shouldn't be instantiated."); } }; template<> struct Impl<std::is_pointer<int*>> { template<class T> static T func(T u) { return u; } }; template<class T> inline T entry_func(T u) { //return Impl<std::is_pointer<T >>::func<T>(u); // (1) fail //return Impl<std::is_pointer<T >>::template func<T>(u); // (2) ok return Impl<std::is_pointer<int>>::func<T>(u); // (3) ok??? } int main() {} 。为什么?根据我的理解,更改不应影响关键字的需要。

{{1}}

g ++ version 5.3.1,clang version 3.8.0。

1 个答案:

答案 0 :(得分:4)

(3)中的

Impl<std::is_pointer<int>>::func不是entry_func中的从属名称。
因此,func是模板函数的事实可以在没有template关键字的情况下轻松解决。
请注意,在这种情况下,您使用T来专门化Impl<std::is_pointer<int>>::func而非Impl<std::is_pointer<int>>,就像在(1) / (2)中所做的那样。这是阅读两种情况之间差异的关键。