求問大佬們,為什么我寫的友元函式Merge2在類外定義時會報錯說無法決議的外部符號,而在類內就可以正常運行
#include<iostream>
#include<string>
using namespace std;
#define MAXSIZE 1001
template <class T>
class SqListClass {
T* data;
int length;
friend void Merge2(SqListClass<T>& L, const SqListClass<T>& a, const SqListClass<T>& b) {
{
int i = 0, j = 0, k = 0;
while (i < a.length && j < b.length) {
if (a.data[i] < b.data[j])
{
L.data[k++] = a.data[i++];
}
else {
L.data[k++] = b.data[j++];
}
}
while (i < a.length)
L.data[k++] = a.data[i++];
while (j < b.length)
L.data[k++] = b.data[j++];
L.length = k;
}
}
public:
SqListClass();
~SqListClass();
void CreateList(T a[], int n);
int GetLength() { return length; }
void DispList();
};
template <typename T>
SqListClass<T>::SqListClass() {
data = new T[MAXSIZE];
length = 0;
}
//建構式
template <typename T>
SqListClass<T>::~SqListClass() {
delete[]data;
}
template <typename T>
void SqListClass<T>::CreateList(T a[], int n) {
int i;
for (i = 0; i < n; i++)
data[i] = a[i];
length = i;
}
template <typename T>
void SqListClass<T>::DispList(){
int i;
if (length > 0) {
for (i = 0; i < length; i++)
{
if (i != length- 1)
cout << data[i] << " ";
else cout << data[i] << endl;
}
}
}
int main() {
int z,i;
cin >> z;
for (i = 0; i < z; i++)
{
int a[1001], b[1001];
SqListClass<int> p1, p2, p3;
int n, m,j;
cin >> n;
for (j = 0; j < n; j++)
{
cin >> a[j];
}
p1.CreateList(a, n);
cin >> m;
for (j = 0; j < m; j++)
{
cin >> b[j];
}
p2.CreateList(b, m);
Merge2(p3,p1, p2);
cout << p3.GetLength()<<" ";
p3.DispList();
}
}
uj5u.com熱心網友回復:
含有friend關鍵字的友元宣告只是一種權限的宣告,并不是正式函式的宣告,在類外定義友元函式Merge2的一種解決方案如下。
template <class T>
class SqListClass
{
T* data;
int length;
public:
template <class T>
friend void Merge2(SqListClass<T>&, const SqListClass<T>&, const SqListClass<T>&); //友元宣告
};
template <class T>
void Merge2(SqListClass<T>& L, const SqListClass<T>& a, const SqListClass<T>& b) //函式宣告
{
//TODO
}
int main()
{
SqListClass<int> p1, p2, p3;
Merge2(p3, p1, p2);//OK
}
uj5u.com熱心網友回復:
我這么寫編譯器直接報錯了
uj5u.com熱心網友回復:
我知道了,宣告時候少了template <class T>轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/12598.html
標籤:C++ 語言
上一篇:VS2013+QT出現stack overflow的錯誤提示排查思路
下一篇:C++ primer真心坑人
