使用しているプログラムが特定のテンプレート引数に対して非型のテンプレートクラスメソッドを呼び出すと、コンパイラエラーが発生します。特定の型以外の値に対してテンプレートサブクラスメソッドをインスタンス化しようとすると、コンパイラエラーが発生する
Super.h:
class Super {
protected:
Super() {}
public:
virtual void doSomething();
void doSomethingElse();
};
Super.cpp:
typedef SubWithTemplate<1> SubWithTemplate1;
typedef SubWithTemplate<2> SubWithTemplate2;
SubWithTemplate1 &subWithTemplate1 = SubWithTemplate1::instance;
SubWithTemplate2 &subWithTemplate2 = SubWithTemplate2::instance;
subWithTemplate1.doSomething(); // Should compile OK
subWithTemplate1.doSomethingElse(); // Should compile OK
subWithTemplate2.doSomething(); // Should NOT compile OK
subWithTemplate2.doSomethingElse(); // Should compile OK
私の出発点は、2次のクラスである
void Super::doSomething() {}
void Super::doSomethingElse() {}
SubWithTemplate.h:
template<int SUBNUMBER>
class SubWithTemplate : public Super {
public:
static SubWithTemplate<SUBNUMBER> instance;
void doSomething() {
// Do something
};
private:
SubWithTemplate() : Super() {}
};
template<int SUBNUMBER>
SubWithTemplate<SUBNUMBER> SubWithTemplate<SUBNUMBER>::instance;
私はBoostやmplにあまり流暢ではありませんが、BOOST_MPL_ASSERTが私にいくつかの成功をもたらしてくれるというあいまいな気持ちがあります。しかし、私はその根幹を理解できません。それはすべてのサブクラスで同じインスタンス化する必要がありますよう、
...
void doSomething() {
BOOST_MPL_ASSERT_MSG(<some test on SUBNUMBER being different from 2 and 7 and less than 25>, <what here?>, <what here?>)
};
...
私はスーパーがテンプレート化されないようにする:
SubWithTemplate.h:
は、私のようなものを試してみました。doSomethingでバーチャルを使用することを避けることができれば、さらに優れています。
私の専門家が私を助けることができれば、とても感謝しています。
あなたは(私は疑っている)これを達成することができますと仮定しますが、以来、 'doSomethingの()'あなたがタイプのオブジェクトに 'スーパー*'型のポインタを経由して呼び出されることを防ぐことができますどのように、仮想であります ' SubWithTemplate <2> '?その呼び出しは、実行時にのみ検出可能です! –
私は仮想を取り除き、メソッドを保護された状態にすることで問題が解決されると思います。しかし、SubWithTemplate <2>インスタンスは、そのprotected superメソッドを呼び出すことができます。私の場合は、スーパーユーザーがライブラリユーザーの継承を意図していないため、SubWithTemplateのみが公開されているため、これは問題ありません。 –