Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Жёсткая задачка про ООП в С++ |

14.06.2007, 00:16
|
|
Познающий
Регистрация: 22.10.2005
Сообщений: 37
Провел на форуме: 520745
Репутация:
141
|
|
Жёсткая задачка про ООП в С++
Прелюдия (можно смело пропустить)
Вообщем хочется написать класс полиномов над некоторым типом aType так, чтобы операции были понолстью френд-перегружены, т.е. чтобы работало int==Polynom<int>, int*Polynom<int> и другие приятности.
В не-шаблонном случае это - тривиальнейшая задача. Как только я ввожу шаблоны, aType престаёт приводиться к Polynom, хотя конструктор Polynon<int> имеется. Если выкинуть контекст, и оставить только саму проблему, то получится
Задача
Заставить работать парой волшебных пассов
Код:
#include <iostream>
using namespace std;
template <class aType>
class testClass{
public:
aType data;
testClass(aType c): data(c) {}
bool friend operator==<aType>(testClass<aType>, testClass<aType>);
};
template <class aType>
bool operator==(testClass<aType> a, testClass<aType> b){
return a.data==b.data;
}
int main(){
int a=4;
testClass<int> b(4);
if (a==b) cout << "a equals b\n";
if (b==a) cout << "b equals a\n";
}
В таком состоянии выдает две ошибки:
Код:
no match for `testClass<int> & == int &`
no match for `int & == testClass<int> &`
Если вызывать явные конструкторы Polynom(a)==b, всё работает, но тогда инкапсуляция и всё изящество идёт лесом.
Действительно хоть какое-то решение - делать приведения явно, но внутри класса. Т.е. добавив
Код:
bool friend operator==<aType>(aType a, testClass b<aType>);
bool friend operator==<aType>(testClass a<aType>, aType b);
Ни в одной книге попавшейся мне, включая Строуструпа, этого нет. Но кажется совсем сомнительным, что это невозможно, это ж С++!!! Вообщем, надеюсь прояснить этот вопрос
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|