Какова процедура сравнения специализации класса шаблона
? В стандарте этот пункт не детализирован (или я пропустил нужное место).
Мой вопрос не имеет НИЧЕГО СВЯЗИ с принятием решения о том, какую специализацию использовать во время создания экземпляра. Пожалуйста, не комментируйте это. Вопрос заключается в сравнении специализаций друг с другом, чтобы решить, определена ли конкретная специализация уже или еще нет.
Рассмотрим следующий пример кода:
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): error C2752: '
CoreTemplate
' : списку аргументов шаблона соответствует более одной частичной специализации
Для меня было бы логичнее выдать ошибку за попытку объявить идентичные специализации шаблона . Я не вижу никакой разницы между специализациями выше.
Итак, кто-нибудь знает правила сравнения специализаций шаблонов? Статьи, ссылки, книги и т. д. также помогут.