Примечание: следующий код является недопустимым , но соответствующий компилятор не обязан отклонять его (а некоторые этого не делают).
В библиотеке, с которой я работаю, у меня есть объявление функции шаблона для Foo
и определение функции шаблона для 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; }
Вопрос: Есть ли способ сделать эту работу, которая также является законной?
Проблема заключается в том (если я правильно понимаю), что, несмотря на компиляцию, это технически незаконно: оно нарушает ODR , потому что как явная специализация, так и использование Bar<MyClass>
считаются определениями, несмотря на то, что в случае использования нет тела для работы.
Причины, по которым я хочу использовать этот шаблон для параметризации Foo
, заключаются в том, что в результате руководства по стилюЯ обязан следовать, единственный способ гарантировать, что что-нибудь лексикВключение до определения Bar
должно быть включено в foobar.h
.Но (по причине, которую я ожидаю, мне не нужно объяснять), это не стартер.