Почему компилятор не выдает ошибку при определении сходных специализаций шаблона?

Какова процедура сравнения специализации класса шаблона? В стандарте этот пункт не детализирован (или я пропустил нужное место).
Мой вопрос не имеет НИЧЕГО СВЯЗИ с принятием решения о том, какую специализацию использовать во время создания экземпляра. Пожалуйста, не комментируйте это. Вопрос заключается в сравнении специализаций друг с другом, чтобы решить, определена ли конкретная специализация уже или еще нет.

Рассмотрим следующий пример кода:

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' : списку аргументов шаблона соответствует более одной частичной специализации

Для меня было бы логичнее выдать ошибку за попытку объявить идентичные специализации шаблона . Я не вижу никакой разницы между специализациями выше.

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

10
задан iammilind 27 June 2012 в 05:54
поделиться