注:次のコードは不正ですが、準拠するコンパイラはそれを拒否する必要はありません(拒否しないものもあります)。
私が使用しているライブラリには、のテンプレート関数宣言とinFoo
のテンプレート関数定義があります。Bar
foobar.h
template<class C> int Foo();
template<class C> int Bar() {
return Something( Foo<C>() );
}
意図は、他のコードが次のように使用できるようにすることです。
#include "foobar.h"
int main() {
Bar<MyClass>();
return 0;
}
// Ideally, the usage (above) and the definition (below)
// would/could be in different translation units.
template<> int Foo<MyClass>() { return 5; }
質問: この作業を合法的に行う方法はありますか?
問題は (私が物事を正しく理解している場合) コンパイルしても、これは技術的に違法であるということです:明示的な特殊化と の使用の両方が定義としてカウントされるため、 ODRBar<MyClass>
に違反します。使用例。
このパターンを使用してパラメーター化する理由Foo
は、スタイル ガイドに従う必要があるため、 の定義の前に何かが字句的に含まれていることを確認する唯一の方法は、Bar
によって含まれていることfoobar.h
です。しかし(説明する必要はないと思う理由で)それは初心者です。