Кодявная специализация не может быть другим заявлением
template <typename T>
void foo(const T& t)
{}
template <typename T>
class A
{
template <>
friend void foo<T>(const T& t)
{}
};
дает компилировать ошибку
"defining explicit specialization ‘foo<T>’ in friend declaration friend void foo<T>(const T& t)"
при компиляции с GCC и
"error C3637: 'A<int>::foo' : a friend function definition cannot be a specialization of a unction template"
при компиляции в VS2013
Я подчинен d, что стандарт говорит так, но почему? Я хочу понять причину (под капотом) Существует много статей, в которых написано: «Явная специализация не может быть объявлением друга», но я не могу понять, почему. Есть идеи?
gcc сообщает о явной специализации в области без пространства имен struct a ''и' template-id' foo 'в объявлении первичного шаблона' для заданного кода. –
user2079303
Извините, я скопирую пасту из другого источника –
Явные специализации предотвращают неявное создание экземпляра. Каждый раз, когда вы создаете экземпляр 'A' для нового набора аргументов шаблона, вы должны добавить еще одну явную специализацию' foo'. Он плохо сформирован, не требует диагностики, чтобы добавить эту специализацию, если 'foo' уже был неявно создан для тех же аргументов шаблона [temp.expl.spec]/6. – dyp