カスタムオブジェクトと定数式
-
22-09-2019 - |
質問
私はテンプレートパラメータとしてカスタムクラスのインスタントを使用しようとしている。
class X {
public:
X() {};
};
template <class Foo, Foo foo>
struct Bar {
};
const X x;
Bar<X, x> foo;
コンパイラはそのx
は定数式では使用できません述べています。どうして?コンパイル時に、そのオブジェクトを構築するために与えられたすべてのものがあります。
解決
あなたはそれを行うことはできません。標準14.1氏は述べています:
の 4 の非型テンプレートパラメータは、次の(必要に応じてCV修飾)タイプのいずれかを有するもの:
- 一体型または列挙型、
- 関数へのオブジェクトまたはポインタへのポインタ、
- 関数へのオブジェクトまたは参照への参照、
- メンバへのポインタ
。 5 のの [注:他のタイプは、のテンプレート引数の形式を管理する規則によって明示的または暗黙下記禁止されているの (14.3)。末端注】判断した場合、テンプレートパラメータの最上位CV-修飾子は無視され、その 種類ます。
他のヒント
他の人が指摘したように、
あなたはそれを行うことはできません。だから、限り、あなたはメタプログラミングのゲームをプレイしていないとして、クラスの実際のインスタンスを渡すための通常の方法は、コンストラクタであります:
template <class Foo>
struct Bar {
Bar( const Foo & f ) {
...
}
};
テンプレートのパラメータは、タイプ、または整数定数することができます。 X
はタイプですが、x
ではありません。また、浮動小数点値の定数を使用することはできません。
所属していません StackOverflow