Какова процедура сравнения классов template
? Стандарт не детализирован по этому вопросу (или мне не хватает места).
Мой вопрос НЕ НРАВИТСЯ, чтобы решить, какую специализацию использовать во время создания. Пожалуйста, не комментируйте это. Речь идет о сравнении специализаций друг с другом, чтобы решить, определена ли определенная специализация или нет.
Рассмотрим этот пример кода:
template <class x1, class x2>
struct CoreTemplate { };
template <class x1, class x2>
struct CoreTemplate<x1*, x2*> { int spec; CoreTemplate() { spec = 1; } };
template <class x1, class x2>
struct CoreTemplate<x2*, x1*> { int spec; CoreTemplate() { spec = 2; } };
int main(int argc, char* argv[])
{
CoreTemplate<int*, int*> qq;
printf("var=%d.\r\n", qq.spec);
}
Когда я пытаюсь скомпилировать этот код с помощью MSVC, я получаю ошибку для попытки создания экземпляра внутри функции main
:
cpptest1.cxx(15): ошибка C2752: '
CoreTemplate<x1,x2>
': более одной частичной специализации соответствует список аргументов шаблона
Для меня было бы логичнее выпустить ошибку для попытки объявления идентичных специализированных шаблонов. Я не вижу разницы между специализациями выше.
Итак, кто-нибудь знает правила сравнения специализированных шаблонов? Статьи, ссылки, книги и т.д. Также помогут.