ПрограммированиеФорумОбщее

Перегрузка операций С++ (2 стр)

Страницы: 1 2
#15
15:24, 2 янв 2011

Nomad

const Vec3<type> const &lh
Дважды const на reference бесмысленный и вообще не должен компилироваться нормальным компилятором :/
Такое имеет смысл только на пойнтерах. У Вас получается декларация функции не сходится с объявлением этой же функции.

Вторая проблема в том, что Вы пытаетесь присвоить Vec3<float> к Vec3<int>, это разные классы, пока Вы не объявите нужный оператор, так работать не будет.

Из за особенностей class template в С++, нет смысла разделять тело и объявление функции принадлежащей к class template как это делаете Вы, короче вот:
http://codepad.org/3yFsajYz

#16
15:25, 2 янв 2011

Zefick
Огрехи копипаста, извиняюсь. По всякому уже пробую расставить модификаторы. Верхний вариант в обоих местах.

#17
15:26, 2 янв 2011

Stultus
> Вторая проблема в том, что Вы пытаетесь присвоить Vec3<float> к Vec3<int>, это
> разные классы, пока Вы не объявите нужный оператор, так работать не будет
Тогда должен жаловаться компилятор на type cast а не линкер на отсутствующий оператор.

Stultus
> Из за особенностей class template в С++, нет смысла разделять тело и объявление
> функции принадлежащей к class template как это делаете Вы, короче вот:
Там внешняя friend-функция, она не может быть объявлена в теле класса.

#18
15:28, 2 янв 2011
template<typename> struct Vec3;

template<typename T>
inline Vec3<T> operator- (const Vec3<T> &lh, const Vec3<T> &rh) {
    return Vec3<T>();
}

template<typename T> struct Vec3 {
    template<typename U>  // вуаля!
    friend Vec3<U> operator- (const Vec3<U> &lh, const Vec3<U> &rh);
};
#19
15:29, 2 янв 2011

Nomad
Вы конечно можете разделить эту "внешнюю" функцию, но в этом не будет смысла. У Вас лишь уйдет много лишнего кода который по функциональности будет эквивалентен функции не принадлежащей к классу
template<class T>
::operator-(Vec3<T>...)

#20
15:30, 2 янв 2011

Zefick
Хотелось бы без U  >_<

#21
15:44, 2 янв 2011

Nomad
Я понимаю, что Вам хотелось бы без U, но Вы фундаментально не понимаете, чего делаете, Ваш изначальный код равносилен чему-нибудь вроде Apple - Airplane. Vec3<float> Vec<int> разные классы, по этому им нужны разные функции что бы между собой оперировать. Я так же понимаю, что Вы очень любите friend функции, но в данном случае Вы лишь пишите лишний код. Вот конкретный пример который отлично компилируется и работает:

template<class T>
struct Vec{};

template<class T0, class T1>
Vec<T0> operator-(const Vec<T0>& x, const Vec<T1>& y){return Vec<T0>();}

int main()
{
Vec<int> a= Vec<int>() - Vec<float>();
return 0;
}
#22
16:10, 2 янв 2011

Stultus
> Я понимаю, что Вам хотелось бы без U, но Вы фундаментально не понимаете, чего
> делаете,
Отнюдь, наоборот.
с обоих сторон от оператора -  у меня стоит Vec3<int>
У меня объявлен template<t2> оператор =(Vec3<t2>)  Так что вопрос об этом не стоит, на приведение Vec3<int> к Vec3<float> у меня ругани нет, там всё корректно.
Меня удручает, что я не могу написать

template<typename type>
 Vec3
{
 friend Vec3<type> operator -(Vec3<type>, Vec3<type>); 
}

Ведь было бы логично. Объвляю Vec3<int> и он ищет  friend operator -(Vec3<int>), а не весь скоуп шаблонов.

#23
16:25, 2 янв 2011

Nomad
В С++ у friend функций и friend классов много проблем... Есть методы это обойти но это того не стоит, даже в boost предпочитают использовать public агрегаты вместо friend функций которые ими оперируют. (Например в boost::property_map не помешали бы friend функции).
Лучше всего делать глобальную функцию которая умеет оперировать над определенным концептами классов, тогда получится очень красивое обобщённое программирование :)

#24
17:19, 2 янв 2011

спасибо на счет первого я понял, просто на с++ почти никогда не программировал а что на счет оператора взятия элемента по идндексу где индекс - строка?

#25
17:27, 2 янв 2011

Sokal
  Используй в качестве индекса std::string. Потому что строка в Си - это указатель на её первый элемент. А у двух одинаковых строк могут быть разные адреса. В std::string гарантируется, что строки с одинаковым содержимым вернут true при сравнении на равенство.

#26
18:21, 2 янв 2011

Zefick
> В std::string гарантируется, что строки с одинаковым содержимым вернут true при сравнении на равенство.
Также, как и strcmp гарантирует возвращение ноля, если две строки по разным адресам равны.

#27
18:23, 2 янв 2011

Sokal
Тебе обязательно текстовый индекс?
IronPeter показывал замечательные константные строчки, с блекджеком и шлюхами. Цена сравнения строк равна цене сравнения указателей.
В мапах и прочих ассоциативных контейнерах - самое оно.

#28
22:19, 2 янв 2011

RPGman
да особо и не нужно, пока отложу этот вопрос, надеюсь что на досуге смогу почитать какое-то чтиво по С++, чтобы войти в нирвану :-/

Страницы: 1 2
ПрограммированиеФорумОбщее

Тема в архиве.