を失敗すると、一部のクラスがextention
クラスを形成継承しています。事はextention
クラスは、それが拡張され、クラス知っている必要があります。はstdを使用:: static_assertでis_base_ofは不完全型に私がやろうとしています何
template<typename Self>
class Extention
{
public:
void check() const
{
std::cout << "Extention is valid: "
<< std::boolalpha
<< std::is_base_of<Extention, Self>::value
<< std::endl;
}
};
class Foo : public Extention<Foo> {};
class Bar : public Extention<void> {};
Foo
とBar
クラス良いショー、および拡張子の悪い使い方:
これは、単純に次のように達成することができます。
Foo().check(); → Extention is valid: true
Bar().check(); → Extention is valid: false
私は、しかし
template<typename Self>
class Extention
{
static_assert(std::is_base_of<Extention, Self>::value);
};
を書くために私をもたらしている、コンパイル時にテンプレートの有効性を確認したいとclass Foo
が不完全型を持つように、このstatic_assert
が間違っている私のgccの遺丘群です。
私は間違っていますか?
編集:私は-std=c++17
を使用しています、エラーは私が間違って何をやっているstatic_assert
メンバ関数に 'static_assert'を入れることはできますが、それを機能させるには関数を(おそらくそれを呼び出して)インスタンス化する必要があります。 – HolyBlackCat
@HolyBlackCatをコンストラクタに置くとうまくいくでしょう。あなたが複数のコンストラクタを持っていれば、それは痛いかもしれませんし、エラーが発生しやすくなります。 – Amxx
静的なアサートを持つすべてのコンストラクタにヒットするのではなく、保護された 'Requiredived'から' Extention'テンプレートを派生していますそうすれば、静的なアサートをハングするためのルート保護されたデフォルトのコンストラクタ、 'RequiredBase()'が得られます。または、私はここであなたの目標を誤解したかもしれません。 – WhozCraig