Название: friend-функция в dll Отправлено: andrey2033 от Июль 14, 2010, 09:31 Доброго времени суток!
У меня возникла проблема с friend-функциями класса в моей библиотеке. При их наличии компилятор выдаёт ошибку undefined reference to ... к этим функциям... Без них всё работает. И отсюда вопрос: в dll нельзя пользоваться friend-функциями? Уточню: Сама библиотека компилируется нормально, но при подключении к проекту при использовании friend-функций выдаёт вышеупомянутое.. Название: Re: friend-функция в dll Отправлено: niXman от Июль 14, 2010, 10:42 код показывай...что за функции, и как пытаешься их использовать.
Название: Re: friend-функция в dll Отправлено: andrey2033 от Июль 14, 2010, 10:47 Проблема в том, что код уже исправлен на не содержащий friend'ов. А функции - перегруженный оператор сдвига влево для вывода в поток и ещё одна, ну вообщем:
подключается статически #ifndef DYNMATRIX_H #define DYNMATRIX_H #include <QtGlobal> //! =========================================================================== #ifdef D_SHARED_LIB #define D_SHARED Q_DECL_EXPORT #else #define D_SHARED Q_DECL_IMPORT #endif //! =========================================================================== #include <QTextStream> #include <cmath> //! =========================================================================== class D_SHARED DynMatrix { public: DynMatrix( int m, int n );/// конструктор( создаёт нулевую матрицу размерностью m x n ) DynMatrix( const DynMatrix& rhs );/// конструктор копирования ~DynMatrix();/// деструктор //! --------------------------------------------------------------------------- /** возвращает указаный элемент*/ float element( int i, int j )const{ return data[j]; } /** устанавливает указаный элемент в указаное значение*/ void setElement( int i, int j, float value ){ data[j] = value; } /** возвращает указаный элемент*/ float& operator()( int i, int j )const{ return data[j]; } /** возвращает количество строк матрицы*/ unsigned m() const{ return m_; } /** устанавливает количество строк матрицы*/ void setM( unsigned value ){ m_ = value; } /** возвращает количество столбцов матрицы*/ unsigned n() const{ return n_; } /** устанавливает количество столбцов матрицы*/ void setN( unsigned value ){ n_ = value; } /** возвращает элементы матрицы в виде двумерного массива*/ float** elements() const{ return data; } //! --------------------------------------------------------------------------- DynMatrix& operator+=( const DynMatrix& rhs );/// возвращает ссылку на матрицу, увеличеной на другую DynMatrix& operator-=( const DynMatrix& rhs );/// возвращает ссылку на матрицу, уменьшеную на другую DynMatrix& operator*=( const float rhs );/// возвращает ссылку на матрицу, домноженой на число DynMatrix& operator/=( const float rhs );/// возвращает ссылку на матрицу, доделёную на число //! --------------------------------------------------------------------------- DynMatrix operator+( const DynMatrix& rhs )const;/// складывает две матрицы DynMatrix operator-( const DynMatrix& rhs )const;/// вычитает одну матрицу из другой DynMatrix operator*( const DynMatrix& rhs )const;/// возвращает матрицу, умноженую на другую DynMatrix operator*( const float rhs )const;/// возвращает матрицу умноженную на число friend DynMatrix operator*( const float lhs, const DynMatrix rhs );/// возвращает матрицу умноженную на число( число - левый операнд ) DynMatrix operator/( const float rhs )const;/// возвращает матрицу делённую на число //! --------------------------------------------------------------------------- DynMatrix& operator=( const DynMatrix& rhs );/// оператор присвоения //! --------------------------------------------------------------------------- DynMatrix operator!() const;/// возвращает транспонированую матрицу DynMatrix preMinor( unsigned row, unsigned col )const;/// возвращает указаный минор float determinant() const;/// возвращает определитель DynMatrix inverse() const;/// возвращает обратную матрицу DynMatrix toTriangle();/// возвращает соответствующую треугольную матрицу /*friend */void toTriangle(/* DynMatrix& A,*/ DynMatrix& B ); //! --------------------------------------------------------------------------- /*friend */QTextStream& operator<<( QTextStream& os/*, DynMatrix& m*/ );/// выводит матрицу в поток вывода Qt private: unsigned m_, n_;/// число строк и столбцов float** data;/// массив, содержащий элементы матрицы }; //! =========================================================================== #endif // DYNMATRIX_H Две последнии функции.. Их описание: //! =========================================================================== //! [19] void DynMatrix ::toTriangle(/*DynMatrix& A,*/ DynMatrix& B ) { //if( m != n )break; /*DynMatrix result( m, n ); result = *this;*/ for( unsigned i = 0; i < n_ - 1; ++i ) { for( unsigned j = i; j < n_ - 1; ++j ) { float c = data; float c_1 = data[j + 1]; for( unsigned k = i; k < n_; ++k ) { data[k] /= c; data[k] *= c_1; data[j + 1][k] -= data[k]; } B.data
} } //! [19] //! =========================================================================== //! [20] QTextStream& DynMatrix ::operator<<( QTextStream& os/*, DynMatrix& m*/ ) { for( unsigned i = 0; i < m_; ++i ) { for( unsigned j = 0; j < n_; ++j ) { os << data[j] << " "; } os << endl; } return os; } //! [20] //! =========================================================================== Название: Re: friend-функция в dll Отправлено: niXman от Июль 14, 2010, 12:51 не понял... сейчас все работает? вопрос исчерпан?
Название: Re: friend-функция в dll Отправлено: andrey2033 от Июль 14, 2010, 13:09 Нет... вопрос "Можно ли пользоваться friend-функциями в dll?" - по прежнему открыт.
Название: Re: friend-функция в dll Отправлено: lit-uriy от Июль 14, 2010, 21:07 >>"Можно ли пользоваться friend-функциями в dll?"
в исходниках Qt их хоть отбавляй, а Qt - набор DLL"ок |