私はテンプレートentry_func
を書いています。これはテンプレートクラスのテンプレートメソッドfunc
を使用しています。 entry_func
にfunc
と電話するには、キーワードtemplate
を使用します。この例では、行(1)はコンパイルされず、行(2)は実行されません。これまでのところok。依存テンプレート名がキーワードなしで受け入れられるのはなぜですか?
しかし、私がline(1)を少し変更してline(3)を取得した場合、キーワード(template
)なしでline(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() {}
g ++バージョン5.3.1、clangバージョン3.8.0。