Какова процедура сравнения классов 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>': более одной частичной специализации соответствует список аргументов шаблона
Для меня было бы логичнее выпустить ошибку для попытки объявления идентичных специализированных шаблонов. Я не вижу разницы между специализациями выше.
Итак, кто-нибудь знает правила сравнения специализированных шаблонов? Статьи, ссылки, книги и т.д. Также помогут.