をコンパイルするには非型制約を置くために、私は(I> = F)が必要です。誰かが誤用した場合C++テンプレート:どのように私は実際にはテンプレート</p> <pre><code>template<unsigned char I, unsigned char F> class FOO { .... } </code></pre> <p>を次したとした時間
FOO<1, 2> a;
私はコンパイルエラーを起こしたいと思います。どうやってするか?
おかげ
をコンパイルするには非型制約を置くために、私は(I> = F)が必要です。誰かが誤用した場合C++テンプレート:どのように私は実際にはテンプレート</p> <pre><code>template<unsigned char I, unsigned char F> class FOO { .... } </code></pre> <p>を次したとした時間
FOO<1, 2> a;
私はコンパイルエラーを起こしたいと思います。どうやってするか?
おかげ
一つの方法かもしれC++ assert
に似ている11のstatic_assert
、しかし、コンパイル時にチェック:あなたはC++ 11を持っていない場合は
template<unsigned char I, unsigned char F>
class FOO
{
static_assert(I >= F, "I needs to be larger or equal to F");
...
};
、良い古い配列境界トリックもここで動作します。 I
がF
未満である時はいつでもこれは、「負の配列サイズ」エラーがトリガされます
static int const error_size = I >= F ? 1 : -1;
typedef char ERROR_I_must_not_be_less_than_F[error_size];
:ちょうどあなたのクラスのプライベートセクションに次のように置きます。
'static_assert'は宣言です。それはクラススコープ内に現れることができます。 – kennytm
@KennyTMああ、クラス定義の中に入れてもいいですか?素敵な、それを知らなかった(まあ、とにかくそれを主にまだ使用していない)。 –