سلام . اين قطعه کد من چه ايرادي داره ؟ تا آخر کامپايل ميشه بعد Link error و از اين حرفه ميده .
[html]
template < typename B >
ostream &operator << ( ostream &out, const Array < B > &a )
{
out << a.size;
return out;
}
[/html]
Printable View
سلام . اين قطعه کد من چه ايرادي داره ؟ تا آخر کامپايل ميشه بعد Link error و از اين حرفه ميده .
[html]
template < typename B >
ostream &operator << ( ostream &out, const Array < B > &a )
{
out << a.size;
return out;
}
[/html]
Link error ربطی به ایراد در کد شما نداره بلکه مربوط به این میشه که کتابخانه ای را مسیری رو که لینکر جهت ساختن فایل نهایی اجرایی لازم داره رو یا ندادی یا اشتباه دادی.
سلام برادر
والا منکه نفهمیدم این کدتون چی هست و می خواستید چیکار کنید -بهتر بود کل کد رو می ذاشتید و اون قسمتی
که مشکل داشتید و جدا می کردید-ولی کد و به این صورت تغییر دادم درست کار می کنه
کد:class Ca
{
public:
Ca():size(1){}
int size;
};
template < typename B >
ostream & operator << (ostream &out,const B &a )
{
out << a.size;
return out;
}
int main(void)
{
Ca a;
ofstream out("c:\\file.txt",ios::out);
out<<a;
return 0;
}
اين کل کدهاي من :
[html]
#ifndef ARRAY_H
#define ARRAY_H
#include <iostream>
using namespace std;
template < typename B >
class Array
{
friend ostream &operator << ( ostream &, const Array < B > & );
friend istream &operator >> ( istream &, Array < B > & );
public:
Array ( int = 10 );
Array ( const Array & );
~Array ( );
int getSize ( ) const;
const B &operator = ( const Array & );
bool operator == ( const Array & ) const;
bool operator != ( const Array &right ) const
{
return ! ( *this == right );
}
B &operator [ ] ( int );
B operator [ ] ( int ) const;
private:
int size;
B *ptr;
};
#endif
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include "Array.h"
using namespace std;
template < typename B >
Array < B >::Array ( int arraySize )
{
size = ( arraySize > 0 ? arraySize : 10 );
ptr = new B [ size ];
for ( int i = 0; i < size; i++ )
ptr [ i ] = 0;
}
template < typename B >
Array < B >::Array ( const Array &arrayToCopy ) : size ( arrayToCopy.size )
{
ptr = new B [ size ];
for ( int i = 0; i < size; i++ )
ptr [ i ] = arrayToCopy.ptr [ i ];
}
template < typename B >
Array < B >::~Array ( )
{
delete [ ] ptr;
}
template < typename B >
int Array < B >::getSize ( ) const
{
return size;
}
template < typename B >
const B &Array < B >::operator = ( const Array &right )
{
if ( &right != this )
{
if ( size != right.size )
{
delete [ ] ptr;
size = right.size;
ptr = new B [ size ];
}
for ( int i = 0; i < size; i++ )
ptr [ i ] = right.ptr [ i ];
}
return *this;
}
template < typename B >
bool Array < B >::operator == ( const Array &right ) const
{
if ( size != right.size )
return false;
for ( int i = 0; i < size; i++ )
if ( ptr [ i ] != right.ptr [ i ] )
return false;
return true;
}
template < typename B >
B &Array < B >::operator [ ] ( int subscript )
{
if ( subscript < 0 || subscript >= size )
{
cerr << "\nError: Subscript " << subscript << " out of range" << endl;
exit ( 1 );
}
return ptr [ subscript ];
}
template < typename B >
B Array < B >::operator [ ] ( int subscript ) const
{
if ( subscript < 0 || subscript >= size )
{
cerr << "\nError: Subscript " << subscript << " out of range" << endl;
exit ( 1 );
}
return ptr [ subscript ];
}
template < typename B >
istream &operator >> ( istream &input, Array < B > &a )
{
for ( int i = 0; i < a.size; i++ )
input >> a.ptr [ i ];
return input;
}
template < typename B >
ostream &operator << ( ostream &output, const Array < B > &a )
{
int i;
for ( i = 0; i < a.size; i++ )
{
output << setw ( 12 ) << a.ptr [ i ];
if ( ( i + 1 ) % 4 == 0 )
output << endl;
}
if ( i % 4 != 0 )
output << endl;
return output;
}
#include <iostream>
#include "Array.h"
using namespace std;
int main ( )
{
Array < int > as ( 5 );
cout << "Size of array is : " << as.getSize ( ) << "\nArray contents : " << as;
Array < double > ad ( 6 );
cout << "\nSize of array is : " << ad.getSize ( ) << "\nArray contents : " << ad;
system ( "pause" );
return 0;
}
[/html]
اين هم ارور ها :
[html]
Error 1 error LNK2019: unresolved external symbol "public: __thiscall Array<int>::~Array<int>(void)" (??1?$Array@H@@QAE@XZ) referenced in function _main main.obj
Error 2 error LNK2019: unresolved external symbol "public: __thiscall Array<double>::~Array<double>(void)" (??1?$Array@N@@QAE@XZ) referenced in function _main main.obj
Error 3 error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Array<double> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@ std@@AAV01@ABV?$Array@N@@@Z) referenced in function _main main.obj
Error 4 error LNK2019: unresolved external symbol "public: int __thiscall Array<double>::getSize(void)const " (?getSize@?$Array@N@@QBEHXZ) referenced in function _main main.obj
Error 5 error LNK2019: unresolved external symbol "public: __thiscall Array<double>::Array<double>(int)" (??0?$Array@N@@QAE@H@Z) referenced in function _main main.obj
Error 6 error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Array<int> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@ std@@AAV01@ABV?$Array@H@@@Z) referenced in function _main main.obj
Error 7 error LNK2019: unresolved external symbol "public: int __thiscall Array<int>::getSize(void)const " (?getSize@?$Array@H@@QBEHXZ) referenced in function _main main.obj
Error 8 error LNK2019: unresolved external symbol "public: __thiscall Array<int>::Array<int>(int)" (??0?$Array@H@@QAE@H@Z) referenced in function _main main.obj
Error 9 fatal error LNK1120: 8 unresolved externals C:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Projects\Array\Debug\Array.exe
[/html]
حالا اين Link Error رو چجوري برطرف کنيم ؟ چرا براي برنامه هاي ديگه نمي گيره براي اين مي گيره ؟
من که احتمال ميدم مال سربارگذاري جريان هاي ورودي و خروجي هستش . چون با زياد کردن اونا ارور ها هم بيشتر ميشن .
اشتباه شد....
نه برنامه ام تحت دات نت نيست دوست عزيز
همش از کتابخانه استاندارده
اشتباه شد....
تحت دات نت کامپايل نمي کنم .
Win 32 Console Application .
از کجا حدس مي زنين تحت دات نته ؟
برادر مشکل از این دو خط هست اینا رو از حالت friend در بیارید و بعد بصورت تک پارامتری باز نویسیش کنید برای اطلاعات بیشتر به MSDN برای خطای LNK2019 مراجعه کنید (احتمالا این رو خودتون هم می دونید که اگه تابعی در یک کلاس بصورت friend نوشته بشه در واقع یک نوع تابع inline برای اون کلاس هست)
و اگه همین کد رو بر روی بورلند کامپایل کنید این مشکل برطرف می شه اما یه سری خطای دیگه می گیره مثلا باید بجای typename از واژه class استفاده بشه من کد رو بصورت زیر تغییر دادم و روی بورلند کامپایل و اجرا کردمکد:friend ostream &operator << ( ostream &, const Array < B > & );
friend istream &operator >> ( istream &, Array < B > & );
این هم کدی که بر روی Visual Studio هم اجرا می شه البته با بیرون آوردن اون توابع از کلاس البته همون طور که گفتم با تغییر در شیوه overload کردن اوپراتورها می تونید دوباره تعریفشون و به کلاس برگردونیدکد:#include<iostream>
#include<string>
#include<fstream>
#include<conio.h>
#include <iomanip>
#include <stdlib.h>
template < class B >
class Array
{
friend ostream &operator << ( ostream &, const Array < B > & );
friend istream &operator >> ( istream &, Array < B > & );
public:
Array ( int = 10 );
Array ( const Array & );
~Array ( );
int getSize ( ) const;
const B &operator = ( const Array & );
bool operator == ( const Array & ) const;
bool operator != ( const Array &right ) const
{
return ! ( *this == right );
}
B &operator [ ] ( int );
B operator [ ] ( int ) const;
private:
int size;
B *ptr;
};
template < class B >
Array < B >::Array ( int arraySize )
{
size = ( arraySize > 0 ? arraySize : 10 );
ptr = new B [ size ];
for ( int i = 0; i < size; i++ )
ptr [ i ] = 0;
}
template < class B >
Array < B >::Array ( const Array &arrayToCopy ) : size ( arrayToCopy.size )
{
ptr = new B [ size ];
for ( int i = 0; i < size; i++ )
ptr [ i ] = arrayToCopy.ptr [ i ];
}
template < class B >
Array < B >::~Array ( )
{
delete [ ] ptr;
}
template < class B >
int Array < B >::getSize ( ) const
{
return size;
}
/*
template < class B >
const B &Array < B >::operator = ( const Array &right )
{
if ( &right != this )
{
if ( size != right.size )
{
delete [ ] ptr;
size = right.size;
ptr = new B [ size ];
}
for ( int i = 0; i < size; i++ )
ptr [ i ] = right.ptr [ i ];
}
return *this;
}
*/
template < class B >
bool Array < B >::operator == ( const Array &right ) const
{
if ( size != right.size )
return false;
for ( int i = 0; i < size; i++ )
if ( ptr [ i ] != right.ptr [ i ] )
return false;
return true;
}
template < class B >
B &Array < B >::operator [ ] ( int subscript )
{
if ( subscript < 0 || subscript >= size )
{
cerr << "\nError: Subscript " << subscript << " out of range" << endl;
exit ( 1 );
}
return ptr [ subscript ];
}
template < class B >
B Array < B >::operator [ ] ( int subscript ) const
{
if ( subscript < 0 || subscript >= size )
{
cerr << "\nError: Subscript " << subscript << " out of range" << endl;
exit ( 1 );
}
return ptr [ subscript ];
}
template < class B >
istream &operator >> ( istream &input, Array < B > &a )
{
for ( int i = 0; i < a.size; i++ )
input >> a.ptr [ i ];
return input;
}
template < class B >
ostream &operator << ( ostream &output, const Array < B > &a )
{
int i;
for ( i = 0; i < a.size; i++ )
{
output << setw ( 12 ) << a.ptr [ i ];
if ( ( i + 1 ) % 4 == 0 )
output << endl;
}
if ( i % 4 != 0 )
output << endl;
return output;
}
int main ( )
{
Array < int > as ( 5 );
cout << "Size of array is : " << as.getSize ( ) << "\nArray contents : " << as;
Array < double > ad ( 6 );
cout << "\nSize of array is : " << ad.getSize ( ) << "\nArray contents : " << ad;
system ( "pause" );
return 0;
کد:#include<iostream>
#include<fstream>
using namespace std;
template < typename B >
class Array
{
//friend ostream &operator << ( ostream &, const Array < B > & );
//friend istream &operator >> ( istream &, Array < B > & );
public:
Array ( int = 10 );
Array ( const Array & );
~Array ( );
int getSize ( ) const;
const B &operator = ( const Array & );
bool operator == ( const Array & ) const;
bool operator != ( const Array &right ) const
{
return ! ( *this == right );
}
B &operator [ ] ( int );
B operator [ ] ( int ) const;
private:
int size;
B *ptr;
};
template < typename B >
Array < B >::Array ( int arraySize )
{
size = ( arraySize > 0 ? arraySize : 10 );
ptr = new B [ size ];
for ( int i = 0; i < size; i++ )
ptr [ i ] = 0;
}
template < typename B >
Array < B >::Array ( const Array &arrayToCopy ) : size ( arrayToCopy.size )
{
ptr = new B [ size ];
for ( int i = 0; i < size; i++ )
ptr [ i ] = arrayToCopy.ptr [ i ];
}
template < typename B >
Array < B >::~Array ( )
{
delete [ ] ptr;
}
template < typename B >
int Array < B >::getSize ( ) const
{
return size;
}
template < typename B >
const B &Array < B >::operator = ( const Array &right )
{
if ( &right != this )
{
if ( size != right.size )
{
delete [ ] ptr;
size = right.size;
ptr = new B [ size ];
}
for ( int i = 0; i < size; i++ )
ptr [ i ] = right.ptr [ i ];
}
return *this;
}
template < typename B >
bool Array < B >::operator == ( const Array &right ) const
{
if ( size != right.size )
return false;
for ( int i = 0; i < size; i++ )
if ( ptr [ i ] != right.ptr [ i ] )
return false;
return true;
}
template < typename B >
B &Array < B >::operator [ ] ( int subscript )
{
if ( subscript < 0 || subscript >= size )
{
cerr << "\nError: Subscript " << subscript << " out of range" << endl;
exit ( 1 );
}
return ptr [ subscript ];
}
template < typename B >
B Array < B >::operator [ ] ( int subscript ) const
{
if ( subscript < 0 || subscript >= size )
{
cerr << "\nError: Subscript " << subscript << " out of range" << endl;
exit ( 1 );
}
return ptr [ subscript ];
}
template < typename B >
istream &operator >> ( istream &input, B &a )
{
for ( int i = 0; i < a.size; i++ )
input >> a.ptr [ i ];
return input;
}
template < typename B >
ostream &operator << ( ostream &output, const B &a )
{
int i;
for ( i = 0; i < a.size; i++ )
{
output << setw ( 12 ) << a.ptr [ i ];
if ( ( i + 1 ) % 4 == 0 )
output << endl;
}
if ( i % 4 != 0 )
output << endl;
return output;
}
int main ( )
{
return 0;
}
خيلي ممنون دوست عزيز . حل شد . پس نبايد Interface از Implementation جدا بشه . ضمنا چون ديگه ostream و istream براي کلاس ، friend نيستن پس نمي تونن به داده هاي private دسترسي داشته باشن . پس اجبارا بايد اونا رو هم به public بياريم .
خلاصه اين شد :
[html]
#include <iostream>
#include <iomanip>
using namespace std;
template < typename B >
class Array
{
public:
Array ( int = 10 );
Array ( const Array & );
~Array ( )
{
delete [ ] ptr;
}
int getSize ( ) const;
const B &operator = ( const Array & );
bool operator == ( const Array & ) const;
bool operator != ( const Array &right ) const
{
return ! ( *this == right );
}
B &operator [ ] ( int );
B operator [ ] ( int ) const;
int size;
B *ptr;
};
template < typename B >
Array < B >::Array ( int arraySize )
{
size = ( arraySize > 0 ? arraySize : 10 );
ptr = new B [ size ];
for ( int i = 0; i < size; i++ )
ptr [ i ] = 0;
}
template < typename B >
Array < B >::Array ( const Array &arrayToCopy ) : size ( arrayToCopy.size )
{
ptr = new B [ size ];
for ( int i = 0; i < size; i++ )
ptr [ i ] = arrayToCopy.ptr [ i ];
}
template < typename B >
int Array < B >::getSize ( ) const
{
return size;
}
template < typename B >
const B &Array < B >::operator = ( const Array &right )
{
if ( &right != this )
{
if ( size != right.size )
{
delete [ ] ptr;
size = right.size;
ptr = new B [ size ];
}
for ( int i = 0; i < size; i++ )
ptr [ i ] = right.ptr [ i ];
}
return *this;
}
template < typename B >
bool Array < B >::operator == ( const Array &right ) const
{
if ( size != right.size )
return false;
for ( int i = 0; i < size; i++ )
if ( ptr [ i ] != right.ptr [ i ] )
return false;
return true;
}
template < typename B >
B &Array < B >::operator [ ] ( int subscript )
{
if ( subscript < 0 || subscript >= size )
{
cerr << "\nError: Subscript " << subscript << " out of range" << endl;
exit ( 1 );
}
return ptr [ subscript ];
}
template < typename B >
B Array < B >::operator [ ] ( int subscript ) const
{
if ( subscript < 0 || subscript >= size )
{
cerr << "\nError: Subscript " << subscript << " out of range" << endl;
exit ( 1 );
}
return ptr [ subscript ];
}
template < typename B >
istream &operator >> ( istream &input, Array < B > &a )
{
for ( int i = 0; i < a.size; i++ )
input >> a.ptr [ i ];
return input;
}
template < typename B >
ostream &operator << ( ostream &output, const Array < B > &a )
{
int i;
for ( i = 0; i < a.size; i++ )
{
output << setw ( 12 ) << a.ptr [ i ];
if ( ( i + 1 ) % 4 == 0 )
output << endl;
}
if ( i % 4 != 0 )
output << endl;
return output;
}
[/html]
بازم ممنون ...