2016-09-17 3 views
3

私はテンプレートentry_funcを書いています。これはテンプレートクラスのテンプレートメソッドfuncを使用しています。 entry_funcfuncと電話するには、キーワード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。

答えて

4

Impl<std::is_pointer<int>>::func(3)は、entry_funcには従属名ではありません。
funcがテンプレート機能であることは、templateキーワードがなければ簡単に解決できます。この場合には、あなたがで行ったように、Impl<std::is_pointer<int>>::funcないImpl<std::is_pointer<int>>を専門とするTを使用していることを
注(1)
/(2)を。これは、2つのケースの違いを読み取るための鍵です。

関連する問題