7

部分的な特殊化のために静的変数を初期化するにはどうすればよいですか?

template <bool A=true, bool B=false>
struct from {
    const static std::string value; 
};

// no specialization - works
template <bool A, bool B>
const std::string from<A, B>::value = "";

// partial specialization - does not compile -  
// Error: template argument list following class template name must list parameters in the order used in template parameter list
// Error: from<A,B>' : too few template arguments
template <bool B>
const std::string from<true, B>::value = "";

// full specialization - works
const std::string from<false, true>::value = "";

部分的に機能しないのはなぜですか?

EDIT:テンプレートクラスの静的データメンバーの初期化のための部分的なテンプレートの特殊化に基づく解決策を見つけました

静的変数を初期化する前に、部分的な特殊化の宣言を繰り返す必要があります。

template <bool B>
struct from<true, B> {
    const static std::string value; 
};

繰り返しますが、質問はなぜですか?

4

2 に答える 2

4

メンバーの部分的な特殊化 (関数であるか静的データであるかにかかわらず) は、クラス テンプレート自体を囲む部分的な特殊化なしでは許可されません。

つまり、クラス テンプレートも特殊化する必要があります。したがって、次のように動作するはずです。

//partial specialization of class template
template <bool B>
struct from<true, B> {
    const static std::string value; 
};

//now you can do this!    
template <bool B>
const std::string from<true, B>::value = ""

また、これはコンパイルされません (これをコンパイルしようとしましたか?):

// full specialization - works (SORRY, IT WILL NOT WORK!)
const std::string from<false, true>::value = "";  //this should be an error

あなたはこれを書く必要があります:

// full specialization 
template<>   //<---- this is important!
const std::string from<false, true>::value = ""
于 2012-11-15T19:39:02.683 に答える
2

これは、テンプレートの完全な特殊化です。

#include <string>
#include <iostream> 

template <bool A=true, bool B=false>
struct from {
  const static std::string value; 
};

// no specialization - works
template <bool A, bool B>
const std::string from<A, B>::value = "no specialization";

// full specialization, note the empty template parameter list
template <>
const std::string from<true, true>::value = "<true,true> specialization";


int main() {
   std::cout << from<false, false>::value << std::endl;
   std::cout << from<true, true>::value << std::endl;
}

パーシャルを定義する正しい方法を見つけました。

パーシャルが機能しない理由は、静的フィールドの初期化を提供する前に構造体型を宣言する必要があるためです。部分的な特殊化はそれ自体がテンプレートであり、定義する価値があります。

完全な特殊化は、実際には初期テンプレートの型インスタンスであるため、個別に定義する必要はありません。

于 2012-11-15T19:48:42.737 に答える