Explicity, специализирующая шаблон класса в исходном файле - PullRequest
2 голосов
/ 07 марта 2019

У меня есть шаблон класса с некоторыми псевдонимами шаблона.Поскольку я использую только закрытый набор типов в шаблоне, я хотел бы специализировать и явно создавать их экземпляры.В настоящее время у меня есть это:

// Header
template <typename T>
struct Literal {
    Literal(std::string_view);
};

using StringLiteral = Literal<std::string>;

// Source:
StringLiteral::Literal(std::string_view){/*...*/}

Я предполагал, что мне понадобится extern template StringLiteral или что-то, но это, кажется, работает.Я могу использовать StringLiteral в совершенно ином TU, чем тот, в котором живет специализация.

Мой вопрос, это законно?И если да, то почему не требуется явная реализация?Мы не могли неявно создать экземпляр шаблона в другом TU, поскольку у нас нет определения для конструктора.

Кроме того, использование псевдонима шаблона для специализации мне кажется странным, верно ли это?

...