我已经编写了一个模板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。
答案 0 :(得分:4)
Impl<std::is_pointer<int>>::func
不是entry_func
中的从属名称。
因此,func
是模板函数的事实可以在没有template
关键字的情况下轻松解决。
请注意,在这种情况下,您使用T
来专门化Impl<std::is_pointer<int>>::func
而非Impl<std::is_pointer<int>>
,就像在(1) / (2)中所做的那样。这是阅读两种情况之间差异的关键。