2017-05-10 12 views
0

ノンタイプのテンプレートクラスメソッドを作成するための正しい構文が何か不思議でした。私はこれを試しましたが、明らかに動作しません:ノンタイプのテンプレートパラメータを持つメソッド

class A 
{ 
    enum B 
    { 
     C = 0, 
     D 
    }; 
    template <A::B value = A::C> 
    int fun(); 
}; 

template<A::B value> 
int A::fun<A::B::C>() 
{ 
    return 1; 
} 

template<A::B value> 
int A::fun<A::B::D>() 
{ 
    return fun<B>() + 1; 
} 

私は間違って何をしていますか?

答えて

1

機能テンプレートを部分的に特殊化しようとしていますが、これは許可されていません。コンパイル可能なスニペットは次のとおりです。

class A 
{ 
    enum B 
    { 
     C = 0, 
     D 
    }; 
    template <A::B value = A::C> 
    int fun(); 
}; 

template<> 
int A::fun<A::B::C>() 
{ 
    return 1; 
} 

template<> 
int A::fun<A::B::D>() 
{ 
    return fun<B::C>() + 1; 
} 
2

特殊化構文が正しくないという問題があります。関数の部分的な特殊化を試みていますが、ここでも意味をなさない - とにかく許可されていません。

fun<B>()も2回目の特殊化で呼び出そうとしますが、Bは型名であり、列挙型の値ではないため、呼び出しを解決できません。

代わりにこれを試してみてください:

// Removed template argument to make a complete specialization instead of partial. 
template<> 
int A::fun<A::B::C>() 
{ 
    return 1; 
} 

// Removed template argument to make a complete specialization instead of partial. 
template<> 
int A::fun<A::B::D>() 
{ 
    // Changed template argument from B (which is a type) to C (which is a value of 
    // type B. 
    return fun<C>() + 1; 
} 
関連する問題