読みやすさの理由から、名前空間内で宣言されているクラスの定義に近い関数テンプレートを特殊化したいと思います。
#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>() {
~~^
それは不可能です。特殊化はテンプレート自体と同じ名前空間に存在する必要があります。
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]
コメントを追加