派生テンプレートクラスの基本クラスからメソッドを特殊化します

アンドレイ・ダミアン

テンプレートの特殊化をどのように行うべきかを理解するのに苦労しています。今回は、残念ながら、グーグルとSOは私を助けることができませんでした。

基本クラスの場合:

class base
{
public:
    virtual ~base() = 0;

    virtual int getInt() { throw std::invalid_argument(std::string(typeid(*this).name()) + " can't return int"); }
};
base::~base() {}

および派生クラス:

template<class T>
class derived : public base
{
public:
    derived() {}
    derived(T value) { mValue = value; }

private:
    T mValue;
};

このコード:

void proof(base* arg)
{
    try
    {
        std::cout << arg->getInt();
    }
    catch (std::exception& e)
    {
        std::cout << e.what();
    }
    std::cout << "\n\n";
}

int main()
{
    base* a = new derived<int>(23);
    base* b = new derived<std::string>("abc");

    proof(a);
    proof(b);

    delete a;
    delete b;

    return 0;
}

まだ明らかでない場合の出力:

class derived<int> can't return int

class derived<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > can't return int

getInt()がmValueを返すように、派生の特殊化をどのように行う必要がありますか?何かのようなもの:

template<>
int derived<int>::getInt() { return mValue; } 

これは機能していません。

より明確にするために、arg-> getInt()を呼び出すと、出力23を実行し、arg-> getInt()を呼び出すと、基本クラスで例外をスローすることを期待しています。サンプルコードを教えていただけますか?ありがとうございました。

Sam Varshavchik

derivedテンプレートはありませんgetInt()方法を。存在しないものを専門にすることはできません。

テンプレート全体を特殊化する必要があります。これを試して:

template<>
class derived<int> : public base
{
public:
    derived() {}
    derived(int value) { mValue = value; }
    int getInt() override { return mValue; } 
private:
    T mValue;
};

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

クラステンプレートメソッドの特殊化

分類Dev

特定のタイプのテンプレートクラスメソッドを特殊化する方法は?

分類Dev

テンプレート クラス内のメソッドを特殊化する適切な方法

分類Dev

派生クラスのメンバーテンプレートクラスの部分的なクラス内特殊化を実行することは合法ですか?

分類Dev

基本の非テンプレートクラスから派生テンプレートクラスメソッドを呼び出す

分類Dev

C ++テンプレートの特殊化に基本クラスを追加する

分類Dev

C ++テンプレートの特殊化に基本クラスを追加する

分類Dev

クラステンプレート全体に基づいたクラスメソッドの特殊化

分類Dev

クラス外で特殊化テンプレートメソッドを宣言する方法は?

分類Dev

タイプがポインタの場合、テンプレートクラスメソッドの特殊化は失敗します

分類Dev

クラステンプレートの列挙(タイプ)メンバーを特殊化できますか?

分類Dev

テンプレート化されたクラス内のメソッドの完全な特殊化

分類Dev

std :: hash用の基本クラスの部分テンプレート特殊化を使用してオブジェクトをハッシュします

分類Dev

テンプレートの特殊化は特定のサブクラスから継承します

分類Dev

メンバー変数とメソッドのデフォルト値を使用したテンプレートクラスの特殊化

分類Dev

パラメータパックを使用したテンプレートクラスの特殊化

分類Dev

クラスがテンプレートの特殊化であるかどうかを確認しますか?

分類Dev

クラスがテンプレートの特殊化であるかどうかを確認します

分類Dev

テンプレート化されたクラスとテンプレート化されたメソッドのテンプレート特殊化構文

分類Dev

派生クラスから基本クラスコンストラクターの特殊化を実装する別の方法は何ですか?

分類Dev

テンプレートクラスメソッドの部分的な特殊化またはインスタンス化

分類Dev

特殊化による個別の宣言と定義を持つテンプレートクラスのメソッドでstd :: enable_ifを使用する方法

分類Dev

テンプレートクラスの非テンプレートメソッドでのテンプレートの特殊化

分類Dev

関数テンプレート(クラステンプレートのメンバー)を明示的に特殊化すると、「部分的な特殊化は許可されていません」というエラーが発生します。なぜですか?

分類Dev

テンプレートテンプレートパラメータを使用して基本クラスを特殊化する

分類Dev

派生クラスによるc ++テンプレートの特殊化

分類Dev

テンプレート化されていないクラスのテンプレート化されたメンバーメソッドを部分的に特殊化するにはどうすればよいですか?

分類Dev

テンプレートの特殊化を使用した基本クラスを介したconstメソッドでのローカルコンテナーのサイズ変更

分類Dev

C#の派生クラスのメンバー型をどのように特殊化しますか?

Related 関連記事

  1. 1

    クラステンプレートメソッドの特殊化

  2. 2

    特定のタイプのテンプレートクラスメソッドを特殊化する方法は?

  3. 3

    テンプレート クラス内のメソッドを特殊化する適切な方法

  4. 4

    派生クラスのメンバーテンプレートクラスの部分的なクラス内特殊化を実行することは合法ですか?

  5. 5

    基本の非テンプレートクラスから派生テンプレートクラスメソッドを呼び出す

  6. 6

    C ++テンプレートの特殊化に基本クラスを追加する

  7. 7

    C ++テンプレートの特殊化に基本クラスを追加する

  8. 8

    クラステンプレート全体に基づいたクラスメソッドの特殊化

  9. 9

    クラス外で特殊化テンプレートメソッドを宣言する方法は?

  10. 10

    タイプがポインタの場合、テンプレートクラスメソッドの特殊化は失敗します

  11. 11

    クラステンプレートの列挙(タイプ)メンバーを特殊化できますか?

  12. 12

    テンプレート化されたクラス内のメソッドの完全な特殊化

  13. 13

    std :: hash用の基本クラスの部分テンプレート特殊化を使用してオブジェクトをハッシュします

  14. 14

    テンプレートの特殊化は特定のサブクラスから継承します

  15. 15

    メンバー変数とメソッドのデフォルト値を使用したテンプレートクラスの特殊化

  16. 16

    パラメータパックを使用したテンプレートクラスの特殊化

  17. 17

    クラスがテンプレートの特殊化であるかどうかを確認しますか?

  18. 18

    クラスがテンプレートの特殊化であるかどうかを確認します

  19. 19

    テンプレート化されたクラスとテンプレート化されたメソッドのテンプレート特殊化構文

  20. 20

    派生クラスから基本クラスコンストラクターの特殊化を実装する別の方法は何ですか?

  21. 21

    テンプレートクラスメソッドの部分的な特殊化またはインスタンス化

  22. 22

    特殊化による個別の宣言と定義を持つテンプレートクラスのメソッドでstd :: enable_ifを使用する方法

  23. 23

    テンプレートクラスの非テンプレートメソッドでのテンプレートの特殊化

  24. 24

    関数テンプレート(クラステンプレートのメンバー)を明示的に特殊化すると、「部分的な特殊化は許可されていません」というエラーが発生します。なぜですか?

  25. 25

    テンプレートテンプレートパラメータを使用して基本クラスを特殊化する

  26. 26

    派生クラスによるc ++テンプレートの特殊化

  27. 27

    テンプレート化されていないクラスのテンプレート化されたメンバーメソッドを部分的に特殊化するにはどうすればよいですか?

  28. 28

    テンプレートの特殊化を使用した基本クラスを介したconstメソッドでのローカルコンテナーのサイズ変更

  29. 29

    C#の派生クラスのメンバー型をどのように特殊化しますか?

ホットタグ

アーカイブ