C++模板类中的友元问题(100分)

  • 主题发起人 主题发起人 Prinse
  • 开始时间 开始时间
P

Prinse

Unregistered / Unconfirmed
GUEST, unregistred user!
各位:
下面的例子在编译时没有问题,可是链接时却报错了,不知何故?我用的是BCB6的BCC32编译和链接的。
#include <iostream.h>
template <class T>
class Data {
private:
T data;
public:
Data(T d=T()) : data(d) {};
friend Data operator+(const Data&amp;, const Data&amp;);
friend ostream&amp;
operator<<(ostream&amp;, const Data&amp;);
};
template <class T>
Data<T> operator+(const Data<T>&amp;
L, const Data<T>&amp;
R) {
return Data<T>(L.data+R.data);
}
template <class T>
ostream&amp;
operator<<(ostream&amp;
os, const Data<T>&amp;
D) { return os<<D.data;
}
void main() {
Data<int> a(1), b(2);
cout<<a<<endl;
cout<<b<<endl;
cout<<a+b<<endl;
}
下面是编译链接信息:
Borland C++ 5.6.1 for Win32 Copyright (c) 1993, 2002 Borland
D:/test.CPP:
Turbo Incremental Link 5.62 Copyright (c) 1997-2002 Borland
Error: Unresolved external 'operator +(const Data<int>&amp;, const Data<int>&amp;)' referenced from D:/WORKS/TEMP/test.OBJ
Error: Unresolved external 'operator <<(_STL::basic_ostream<char, _STL::char_traits<char> >&amp;, const Data<int>&amp;)' referenced from D:/WORKS/TEMP/test.OBJ
 
可能使路径设置的问题,链接器找不到目标文件,修改Option/directory看看
 
跟路径没有关系。
下面有两个修改版本,第一仍然是同样的问题,但是第二个版本却没有问题,因此我想应该
是模板中的友元出了问题了。我没在其它编译器下测试过,各位谁帮我试试。
// 1. Modified version 1
// 没有任何改善
#include <iostream.h>
template <class T>
class Data {
public:
T data;
Data(T d=T()) : data(d) {};
friend Data operator+(const Data&amp;, const Data&amp;);
friend ostream&amp;
operator<<(ostream&amp;, const Data&amp;);
};
template <class T>
Data<T> operator+(const Data<T>&amp;
L, const Data<T>&amp;
R) {
return Data<T>(L.data+R.data);
}
template <class T>
ostream&amp;
operator<<(ostream&amp;
os, const Data<T>&amp;
D) { return os<<D.data;
}
void main() {
Data<int> a(1), b(2);
cout<<a<<endl;
cout<<b<<endl;
cout<<a+b<<endl;
}
// 2. Modified version 2
// 可以正确链接
#include <iostream.h>
template <class T>
class Data {
public:
T data;
Data(T d=T()) : data(d) {};
// friend Data operator+(const Data&amp;, const Data&amp;);
// friend ostream&amp;
operator<<(ostream&amp;, const Data&amp;);
};
template <class T>
Data<T> operator+(const Data<T>&amp;
L, const Data<T>&amp;
R) {
return Data<T>(L.data+R.data);
}
template <class T>
ostream&amp;
operator<<(ostream&amp;
os, const Data<T>&amp;
D) { return os<<D.data;
}
void main() {
Data<int> a(1), b(2);
cout<<a<<endl;
cout<<b<<endl;
cout<<a+b<<endl;
}
 
//BCB里friend一定要攘入,VC里随便
#include <iostream.h>
template <class T>
class Data {
friend ostream&amp;
operator<< <>(ostream&amp;
os, const Data<T>&amp;
D){
return os<<D.data;
}
friend Data operator+(const Data&amp;
L, const Data&amp;
R){
return Data<T>(L.data + R.data);
}
private:
T data;
public:
Data(T d=T()) : data(d) {};

};
/*
template <class T>
Data<T> operator+(const Data<T>&amp;
L, const Data<T>&amp;
R) {
return Data<T>(L.data+R.data);
}
template <class T>
ostream&amp;
operator<<(ostream&amp;
os, const Data<T>&amp;
D) { return os<<D.data;
}
*/
void main() {
Data<int> a(1), b(2);
cout<<a<<endl;
cout<<b<<endl;
cout<<a+b<<endl;
system("pause");
}
 
在BCB中真的没有办法吗?我总觉得borland的产品不至于这么……吧!是不是有什么
编译或链接选项可以解决这类问题呢?还是请大家帮帮忙啊。
 
俺不是帮你吗?
 
有用过BCBX的吗?帮我试试。我就是不喜欢VC
 
还有比我懒的人。嘿嘿。
 
后退
顶部