Создание шаблона функции друга

Почему я получаю ошибку компоновщика для следующего?

template<typename T, typename U>
class A {
public:
class B;
};

template<typename T, typename U>
class A<T, U>::B {
friend bool operator==(const B& b1, const B& b2);
};

template<typename T, typename U>
bool operator==(const typename A<T, U>::B& b1, const typename A<T, U>::B& b2) {
return true;
}

int main() {
A<char, int>::B b1;
A<char, int>::B b2;

if (b1 == b2) {
return 0;
} else {
return 1;
}
}

Я получаю ошибку:

Undefined symbols for architecture x86_64:
"operator==(A<char, int>::B const&, A<char, int>::B const&)", referenced from:
_main in test-qSCyyF.o

1

Решение

Потому что вы называете это, и у него нет определения!

это

template<typename T, typename U>
class A<T, U>::B {
friend bool operator==(const B& b1, const B& b2);
};

является декларацией нешаблонном функция друга A<T,U>::B учебный класс.

Это соответствует вызову (b1 == b2) точно так же, как оператор шаблона, который вы определили ниже, но это предпочтительнее, потому что это не шаблон.

GCC даже дает предупреждение с -Wnon-template-friend

предупреждение: объявление друга ‘оператор bool == (const A :: B&, const A :: B&) ‘объявляет не шаблонную функцию [-Wnon-template-friend] примечание: (если это не то, что вы хотели, убедитесь, что шаблон функции уже объявлен и добавьте <> после имени функции здесь)

Чтобы исправить это, дать определение

template<typename T, typename U>
class A<T, U>::B {
friend bool operator==(const B& b1, const B& b2) {
return true;
}
};

и избавьтесь от шаблонного оператора ИЛИ оставьте только шаблонный.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]