定義とは別にvoidに部分的に特殊化されたテンプレートを実装するにはどうすればよいですか?

フェリックスペトリコーニ

部分的な特殊化を行いながら、内部クラスの実装を分離することに問題があります。これが私の問題を説明するサンプルコードです:

#include <type_traits>

template <typename T>
using enable_if_copyable = std::enable_if_t<std::is_copy_constructible<T>::value>;

template <typename T>
using enable_if_not_copyable = std::enable_if_t<!std::is_copy_constructible<T>::value>;

template <typename T, typename Enabled=void> 
struct Foo;

template <typename T>
struct Foo<T, enable_if_copyable<T>>
{
    struct Bar
    {
        Bar();
    };
};

template <typename T>
struct Foo<T, enable_if_not_copyable<T>> {
    struct Bar
    {
        Bar();
    };
};

template <>
struct Foo<void,void>
{
    struct Bar
    {
        Bar();
      //Bar() {} This compiles, but it is not what I want.
    };
};

template <typename T>
Foo<T, enable_if_copyable<T>>::Bar::Bar()
{}    

template <typename T>
Foo<T, enable_if_not_copyable<T>>::Bar::Bar()
{}

template <>
Foo<void, void>::Bar::Bar() // this does not compile
{}


int main() {
    Foo<int>::Bar b;
    Foo<void>::Bar v;
}

依存関係があるためBar、宣言外部のc'torを実装する必要があります。私の問題は、すべてのコンパイラ(Clang、gcc、Visual Studio 2015)Foo<void, void>::Bar::Bar() {}がの宣言の外側の実装について文句を言うことですclass Foo<void, void>スペシャライゼーションBarのc'torを実装すればvoid、問題ありません。これは実行不可能ですか、それとも私の問題を見つけるのを手伝ってくれる人がいますか?よろしくお願いします!

max66

template<>;を削除してみてくださいというのは:

// template <>
Foo<void, void>::Bar::Bar() // now compile
{}

詳細については、このページ参照してください

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

部分的なクラステンプレートの特殊化で継承を実装するにはどうすればよいですか?

分類Dev

完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

分類Dev

完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

分類Dev

* .cppファイルにテンプレート特殊化メソッドを実装するにはどうすればよいですか?

分類Dev

std :: string用にテンプレートを特殊化するにはどうすればよいですか

分類Dev

関数テンプレートを「部分的に特殊化」できるように調整するにはどうすればよいですか?

分類Dev

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

分類Dev

既存のテンプレートクラスを新しいタイプに部分的に特殊化するにはどうすればよいですか?

分類Dev

クラステンプレートの非型パラメータを部分的に特殊化するにはどうすればよいですか?

分類Dev

列挙値のクラステンプレートを部分的に特殊化するにはどうすればよいですか?

分類Dev

関数テンプレートの特殊化を減らすにはどうすればよいですか?

分類Dev

関数テンプレートの部分的な特殊化を回避するにはどうすればよいですか?

分類Dev

パラメータパックと非型テンプレート値を使用して部分的なテンプレートの特殊化を実行するにはどうすればよいですか?

分類Dev

非型テンプレートクラスを特殊化するために、宣言の外部でメソッドを定義するにはどうすればよいですか?

分類Dev

STLコンテナであるテンプレートパラメータに基づいて、選択したメンバー関数の部分的な特殊化をシミュレートするにはどうすればよいですか?

分類Dev

クラステンプレートによって演算子関数タイプを特殊化するにはどうすればよいですか?

分類Dev

インスタンス化されている場合、テンプレート化された変数の特殊化をコンパイル時に失敗させるにはどうすればよいですか?

分類Dev

C ++「新しい」タイプのテンプレートを特殊化するときに、コンストラクターパラメーターを事前定義するにはどうすればよいですか。

分類Dev

関数テンプレートを部分的に特殊化する代わりに、どうすればよいですか?

分類Dev

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

分類Dev

同じテンプレート関数で複数のタイプを特殊化するにはどうすればよいですか?

分類Dev

Clangは、クラステンプレートのネストされたクラスが特殊化によってのみ定義されているコードを拒否することは正しいですか?

分類Dev

typename引数のないテンプレートを特殊化するにはどうすればよいですか?

分類Dev

テンプレート化されたクラスの基本クラスに基づいてメンバー関数を特殊化するにはどうすればよいですか

分類Dev

.cppファイルでテンプレートメンバー関数の明示的な特殊化を定義するにはどうすればよいですか?

分類Dev

プライマリテンプレートをあいまいにすることなく、is_base_ofを使用してテンプレートを特殊化するにはどうすればよいですか?

分類Dev

部分的に特殊化されたテンプレートの個別の実装

分類Dev

特殊化されていないテンプレートが部分的に特殊化されたテンプレートよりも優先されるのはなぜですか?

分類Dev

クラステンプレートの特殊化を使用してエイリアステンプレートの特殊化を作成するにはどうすればよいですか?

Related 関連記事

  1. 1

    部分的なクラステンプレートの特殊化で継承を実装するにはどうすればよいですか?

  2. 2

    完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

  3. 3

    完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

  4. 4

    * .cppファイルにテンプレート特殊化メソッドを実装するにはどうすればよいですか?

  5. 5

    std :: string用にテンプレートを特殊化するにはどうすればよいですか

  6. 6

    関数テンプレートを「部分的に特殊化」できるように調整するにはどうすればよいですか?

  7. 7

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

  8. 8

    既存のテンプレートクラスを新しいタイプに部分的に特殊化するにはどうすればよいですか?

  9. 9

    クラステンプレートの非型パラメータを部分的に特殊化するにはどうすればよいですか?

  10. 10

    列挙値のクラステンプレートを部分的に特殊化するにはどうすればよいですか?

  11. 11

    関数テンプレートの特殊化を減らすにはどうすればよいですか?

  12. 12

    関数テンプレートの部分的な特殊化を回避するにはどうすればよいですか?

  13. 13

    パラメータパックと非型テンプレート値を使用して部分的なテンプレートの特殊化を実行するにはどうすればよいですか?

  14. 14

    非型テンプレートクラスを特殊化するために、宣言の外部でメソッドを定義するにはどうすればよいですか?

  15. 15

    STLコンテナであるテンプレートパラメータに基づいて、選択したメンバー関数の部分的な特殊化をシミュレートするにはどうすればよいですか?

  16. 16

    クラステンプレートによって演算子関数タイプを特殊化するにはどうすればよいですか?

  17. 17

    インスタンス化されている場合、テンプレート化された変数の特殊化をコンパイル時に失敗させるにはどうすればよいですか?

  18. 18

    C ++「新しい」タイプのテンプレートを特殊化するときに、コンストラクターパラメーターを事前定義するにはどうすればよいですか。

  19. 19

    関数テンプレートを部分的に特殊化する代わりに、どうすればよいですか?

  20. 20

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

  21. 21

    同じテンプレート関数で複数のタイプを特殊化するにはどうすればよいですか?

  22. 22

    Clangは、クラステンプレートのネストされたクラスが特殊化によってのみ定義されているコードを拒否することは正しいですか?

  23. 23

    typename引数のないテンプレートを特殊化するにはどうすればよいですか?

  24. 24

    テンプレート化されたクラスの基本クラスに基づいてメンバー関数を特殊化するにはどうすればよいですか

  25. 25

    .cppファイルでテンプレートメンバー関数の明示的な特殊化を定義するにはどうすればよいですか?

  26. 26

    プライマリテンプレートをあいまいにすることなく、is_base_ofを使用してテンプレートを特殊化するにはどうすればよいですか?

  27. 27

    部分的に特殊化されたテンプレートの個別の実装

  28. 28

    特殊化されていないテンプレートが部分的に特殊化されたテンプレートよりも優先されるのはなぜですか?

  29. 29

    クラステンプレートの特殊化を使用してエイリアステンプレートの特殊化を作成するにはどうすればよいですか?

ホットタグ

アーカイブ