LINUX.ORG.RU

C++ шаблоны


0

0

Можно ли определить оператор = для параметризованного класса без соответствующего объявления в объявлении класса?

anonymous

template<typename T>
struct Foo {
T field;
};

template<typename T>
bool operator==(const Foo<T>& lh, const Foo<T>& rh) {
return lh.field == rh.field;
}

int main()
{
Foo<int> a;
Foo<int> b;

a.field = 10;
b.field = 10;

return a == b;
}

fghj ★★★★★
()
Ответ на: комментарий от fghj

ок, а как оформить оператор, если он мне нужен только для T=double или другого конкретного типа?

anonymous
()
Ответ на: комментарий от anonymous

template<typename T> 
bool operator==(const Foo<T>& lh, const Foo<T>& rh) { 
	return lh.field == rh.field; 
} 

bool operator==(const Foo<double>& lh, const Foo<double>& rh) { 
	return fabs(lh.field - rh.field) < 1e-10; 
} 

fghj ★★★★★
()
Ответ на: комментарий от fghj

делаю вот так:

template<typename T>
Field<T>& operator=(Field<T>& a, Field<T>& b)
{
b.val = a.val;
return b;
}

на такое определение компилятор пишет:
error: ‘Field<T>& operator=(Field<T>&, Field<T>&)’ must be a nonstatic member function

anonymous
()
Ответ на: комментарий от anonymous

Присваивание, subscription[] и reference-> не могут быть перегружены кроме как члены класса.

google: assignment non-member overloading

dilmah ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.