別の名前空間内から関数テンプレートを明示的に特殊化する方法は?

user2664470

読みやすさの理由から、名前空間内で宣言されているクラスの定義に近い関数テンプレートを特殊化したいと思います。

#include <iostream>

template<typename T> void my_function() {
    std::cout << "my_function default" << std::endl;
}

namespace Nested {
    class A {};
    template<> void my_function<A>() {
        std::cout << "my_function specialization for A" << std::endl;
    }
}

ただし、上記のコードを使用すると、clang++ 4.0 から次のエラーが発生します。

 error: no function template matches function template specialization 'my_function'

これは名前空間の問題のようです。(テンプレート関数の特殊化をNested名前空間から移動せずに) 上記を機能させるにはどうすればよいですか?

編集:私も::my_function専門分野に追加しようとしました:

test.cpp: error: definition or redeclaration of 'my_function' cannot name the global scope
        template<> void ::my_function<A>() {
                        ~~^
ユーザー7860670

それは不可能です。特殊化はテンプレート自体と同じ名前空間に存在する必要があります。

14.7.3 明示的な特殊化 [temp.expl.spec]

2 明示的な特殊化は、特殊化されたテンプレートを含む名前空間で宣言されなければなりません。declarator-id または class-head-name が修飾されていない明示的な特殊化は、テンプレートの最も近い囲んでいる名前空間、または名前空間がインライン (7.3.1) の場合は、その囲んでいる名前空間セットからの名前空間で宣言されます。そのような宣言は定義でもあります。宣言が定義でない場合、特殊化は後で定義することができます (7.3.1.2)。

したがって、次のようにコードを書き直す必要があります。

namespace Nested {
class A {};
} // namespace Nested

template<> void my_function<Nested::A>() {
    std::cout << "my_function specialization for A" << std::endl;
}

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

std名前空間にテンプレートの特殊化を追加する

分類Dev

T = <名前空間のない名前空間クラス>を持つ関数テンプレート特殊化の静的ローカルは一意である必要がありますか?

分類Dev

警告:異なる名前空間でのテンプレートの特殊化

分類Dev

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

分類Dev

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

分類Dev

テンプレートメンバー関数を特殊化する方法は?

分類Dev

関数テンプレートの明示的な特殊化で複数のテンプレート引数を差し引くことはできますか?

分類Dev

関数テンプレートc ++の明示的な特殊化

分類Dev

明示的な特殊化「...」は、関数テンプレートの特殊化ではありません

分類Dev

テンプレート関数の特殊化が存在するかどうかをテストする方法

分類Dev

テンプレートクラスでの名前空間の特殊化

分類Dev

C ++ 1zでフレンドテンプレートクラステンプレートを宣言するとエラーが発生します:「template <classT> classA」の特殊化は名前空間に表示される必要があります

分類Dev

異なる名前空間のテンプレート特殊化静的メンバー

分類Dev

テンプレートの特殊化の代わりに関数テンプレートを使用する

分類Dev

テンプレートパラメータの関数で1つの名前空間または別の名前空間を使用する

分類Dev

テンプレート関数のタイプ特性に依存する特殊化

分類Dev

テンプレート関数を特殊化して、void関数と非void関数の引数を区別する方法

分類Dev

ソースファイル内のメンバー関数テンプレートの明示的な特殊化

分類Dev

テンプレートの特殊化に関する問題

分類Dev

完全に特殊化されたテンプレート関数は通常の関数と同じですか?

分類Dev

完全に特殊化されたクラステンプレート用の関数テンプレートの明示的な特殊化

分類Dev

テンプレートクラス(すでに指定されている)でテンプレートメンバー関数を特殊化する方法は?

分類Dev

テンプレート関数にC ++ 11のusingキーワードを使用して、スコープ内の名前空間を削除する方法

分類Dev

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

分類Dev

複数の名前空間でのclangエラー「明示的なインスタンス化は関数テンプレートを参照していません」

分類Dev

可変個引数テンプレート関数をC ++で特殊化する方法は?

分類Dev

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

分類Dev

テンプレートパラメータに基づいて、異なる名前空間から類似の関数から選択する方法

分類Dev

テンプレート変数の明示的な特殊化

Related 関連記事

  1. 1

    std名前空間にテンプレートの特殊化を追加する

  2. 2

    T = <名前空間のない名前空間クラス>を持つ関数テンプレート特殊化の静的ローカルは一意である必要がありますか?

  3. 3

    警告:異なる名前空間でのテンプレートの特殊化

  4. 4

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

  5. 5

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

  6. 6

    テンプレートメンバー関数を特殊化する方法は?

  7. 7

    関数テンプレートの明示的な特殊化で複数のテンプレート引数を差し引くことはできますか?

  8. 8

    関数テンプレートc ++の明示的な特殊化

  9. 9

    明示的な特殊化「...」は、関数テンプレートの特殊化ではありません

  10. 10

    テンプレート関数の特殊化が存在するかどうかをテストする方法

  11. 11

    テンプレートクラスでの名前空間の特殊化

  12. 12

    C ++ 1zでフレンドテンプレートクラステンプレートを宣言するとエラーが発生します:「template <classT> classA」の特殊化は名前空間に表示される必要があります

  13. 13

    異なる名前空間のテンプレート特殊化静的メンバー

  14. 14

    テンプレートの特殊化の代わりに関数テンプレートを使用する

  15. 15

    テンプレートパラメータの関数で1つの名前空間または別の名前空間を使用する

  16. 16

    テンプレート関数のタイプ特性に依存する特殊化

  17. 17

    テンプレート関数を特殊化して、void関数と非void関数の引数を区別する方法

  18. 18

    ソースファイル内のメンバー関数テンプレートの明示的な特殊化

  19. 19

    テンプレートの特殊化に関する問題

  20. 20

    完全に特殊化されたテンプレート関数は通常の関数と同じですか?

  21. 21

    完全に特殊化されたクラステンプレート用の関数テンプレートの明示的な特殊化

  22. 22

    テンプレートクラス(すでに指定されている)でテンプレートメンバー関数を特殊化する方法は?

  23. 23

    テンプレート関数にC ++ 11のusingキーワードを使用して、スコープ内の名前空間を削除する方法

  24. 24

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

  25. 25

    複数の名前空間でのclangエラー「明示的なインスタンス化は関数テンプレートを参照していません」

  26. 26

    可変個引数テンプレート関数をC ++で特殊化する方法は?

  27. 27

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

  28. 28

    テンプレートパラメータに基づいて、異なる名前空間から類似の関数から選択する方法

  29. 29

    テンプレート変数の明示的な特殊化

ホットタグ

アーカイブ