Nomad
const Vec3<type> const &lh
Дважды const на reference бесмысленный и вообще не должен компилироваться нормальным компилятором :/
Такое имеет смысл только на пойнтерах. У Вас получается декларация функции не сходится с объявлением этой же функции.
Вторая проблема в том, что Вы пытаетесь присвоить Vec3<float> к Vec3<int>, это разные классы, пока Вы не объявите нужный оператор, так работать не будет.
Из за особенностей class template в С++, нет смысла разделять тело и объявление функции принадлежащей к class template как это делаете Вы, короче вот:
http://codepad.org/3yFsajYz
Zefick
Огрехи копипаста, извиняюсь. По всякому уже пробую расставить модификаторы. Верхний вариант в обоих местах.
Stultus
> Вторая проблема в том, что Вы пытаетесь присвоить Vec3<float> к Vec3<int>, это
> разные классы, пока Вы не объявите нужный оператор, так работать не будет
Тогда должен жаловаться компилятор на type cast а не линкер на отсутствующий оператор.
Stultus
> Из за особенностей class template в С++, нет смысла разделять тело и объявление
> функции принадлежащей к class template как это делаете Вы, короче вот:
Там внешняя friend-функция, она не может быть объявлена в теле класса.
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); };
Nomad
Вы конечно можете разделить эту "внешнюю" функцию, но в этом не будет смысла. У Вас лишь уйдет много лишнего кода который по функциональности будет эквивалентен функции не принадлежащей к классу
template<class T>
::operator-(Vec3<T>...)
Zefick
Хотелось бы без U >_<
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; }
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>), а не весь скоуп шаблонов.
Nomad
В С++ у friend функций и friend классов много проблем... Есть методы это обойти но это того не стоит, даже в boost предпочитают использовать public агрегаты вместо friend функций которые ими оперируют. (Например в boost::property_map не помешали бы friend функции).
Лучше всего делать глобальную функцию которая умеет оперировать над определенным концептами классов, тогда получится очень красивое обобщённое программирование :)
спасибо на счет первого я понял, просто на с++ почти никогда не программировал а что на счет оператора взятия элемента по идндексу где индекс - строка?
Sokal
Используй в качестве индекса std::string. Потому что строка в Си - это указатель на её первый элемент. А у двух одинаковых строк могут быть разные адреса. В std::string гарантируется, что строки с одинаковым содержимым вернут true при сравнении на равенство.
Zefick
> В std::string гарантируется, что строки с одинаковым содержимым вернут true при сравнении на равенство.
Также, как и strcmp гарантирует возвращение ноля, если две строки по разным адресам равны.
Sokal
Тебе обязательно текстовый индекс?
IronPeter показывал замечательные константные строчки, с блекджеком и шлюхами. Цена сравнения строк равна цене сравнения указателей.
В мапах и прочих ассоциативных контейнерах - самое оно.
RPGman
да особо и не нужно, пока отложу этот вопрос, надеюсь что на досуге смогу почитать какое-то чтиво по С++, чтобы войти в нирвану :-/
Тема в архиве.