我在做一道c++模板題,描述如下:
“為Array類創(chuàng)建一個(gè)模板。這個(gè)模板允許在編譯的時(shí)候Array對(duì)象實(shí)例化指定元素個(gè)數(shù)的特定的元素類型。”
而當(dāng)我重載輸入輸出流函數(shù)的時(shí)候編譯總是不通過。
編譯器顯示:
[Warning] friend declaration 'std::istream& operator>>(std::istream&, Array<T, n>&)' declares a non-template function [-Wnon-template-friend]
[Warning] friend declaration 'std::ostream& operator<<(std::ostream&, const Array<T, n>&)' declares a non-template function [-Wnon-template-friend]
代碼如下:
#include<iostream>
using namespace std;
template<class T,int n>
class Array
{
private:
T p[n];
static int count;
public:
friend istream & operator>> (istream & in, Array<T,n>& a);
friend ostream & operator << (ostream & out,const Array<T,n>& a);
int getSize()
{
return n;
}
static int getArrayCount()
{
return count;
}
};
template<class T,int n>
istream & operator >> (istream & in,const Array<T,n>& a)
{
for(int i=0;i<n;i++)
{
in>>a.p[i];
}
a.count++;
return in;
}
template<class T,int n>
ostream & operator << (ostream & out,const Array<T,n>& a)
{
for(int i=0;i<n;i++)
{
out<<a.p[i]<<" ";
}
return out;
}
在此貼上主函數(shù):
int main()
{
Array< int, 5 > intArray1;
cin >> intArray1;
Array< int, 5 > intArray2;
cin >> intArray2;
Array< float, 5 > floatArray;
cin >> floatArray;
cout << "\nIntArray1 contains " << intArray1.getSize() << " Elements.\n";
cout << "The values in intArray are:\n";
cout << intArray1;
cout << "\nIntArray2 contains " << intArray2.getSize() << " Elements.\n";
cout << "The values in intArray are:\n";
cout << intArray2;
cout << "\nDoubleArray contains " << floatArray.getSize() << " Elements.\n";
cout << "The values in the doubleArray are:\n";
cout << floatArray;
cout << "\nThere are " << Array<int,5>::getArrayCount() << " Array<int,5> objects.\n";
cout << "\nThere are " << Array<float,5>::getArrayCount() << " Array<float,5> objects.\n";
return 0;
}
我在網(wǎng)上查了很久,也嘗試了很多解決方法,可是無(wú)論是在
istream & operator >> (istream & in,const Array<T,n>& a)
這一行里的 >> 后面加上 <> 還是把輸入輸出函數(shù)在類里面定義,都是不行。
如果在類里面定義的話,就會(huì)顯示如下錯(cuò)誤:
undefined reference to `Array<float, 5>::count'
[Error] ld returned 1 exit status
如果在 >> 后面加上 <> 的話,會(huì)顯示如下錯(cuò)誤:
[Error] template-id 'operator>><>' in declaration of primary template
所以現(xiàn)在舉步維艱,完全沒有頭緒。
還望各路大神能解答我的疑惑并解釋一下為什么會(huì)出現(xiàn)以上三種錯(cuò)誤。
萬(wàn)分感謝!
@felix 老大已經(jīng)完全解答了OP你的問題, 窩稍微做點(diǎn)微不足道的補(bǔ)充:
foo
此時(shí)會(huì)對(duì)所有X<T>可見. 那么就等于X<int>間接不合理的獲取了所有X<T>的信息(比如其private member). 所以不建議使用, 比如下段代碼可以過編譯.#include<iostream>
using namespace std;
template<typename T>
class A
{
private:
T x;
void setter(T y)
{
x = y;
}
public:
explicit A(T a) : x(a) {}
template<typename U>
friend void foo(A<U> a);
};
A<int> x(7);
template<typename U>
void foo(A<U> a)
{
x.x = 2;
}
int main()
{
A<int> a(7);
A<float> b(1.1);
foo(b);
}
首先靜態(tài)成員變量count需要在類外定義
從c++1z開始可能需要改成首先non-constexpr的靜態(tài)成員變量count需要在類外定義。
詳見http://eel.is/c++draft/depr.s... . demo可以在寫個(gè)odr-use函數(shù)試出.#include<iostream>
using namespace std;
template<class T, int n>
class Array;
template<class T, int n>
istream & operator>> (istream & in, Array<T,n>& a);
template<class T,int n>
ostream & operator << (ostream & out,const Array<T,n>& a);
template<class T, int n>
class Array
{
private:
T p[n];
static int count;
public:
friend istream & operator>> <> (istream & in, Array<T,n>& a);
friend ostream & operator << <> (ostream & out,const Array<T,n>& a);
int getSize()
{
return n;
}
static int getArrayCount()
{
return count;
}
};
template<class T,int n>
istream & operator >> (istream & in, Array<T,n>& a)
{
for(int i=0;i<n;i++)
{
in>>a.p[i];
}
a.count++;
return in;
}
template<class T,int n>
ostream & operator << (ostream & out,const Array<T,n>& a)
{
for(int i=0;i<n;i++)
{
out<<a.p[i]<<" ";
}
return out;
}
template<class T, int n>
int Array<T, n>::count = 0;
int main()
{
Array< int, 5 > intArray1;
cin >> intArray1;
Array< int, 5 > intArray2;
cin >> intArray2;
Array< float, 5 > floatArray;
cin >> floatArray;
cout << "\nIntArray1 contains " << intArray1.getSize() << " Elements.\n";
cout << "The values in intArray are:\n";
cout << intArray1;
cout << "\nIntArray2 contains " << intArray2.getSize() << " Elements.\n";
cout << "The values in intArray are:\n";
cout << intArray2;
cout << "\nDoubleArray contains " << floatArray.getSize() << " Elements.\n";
cout << "The values in the doubleArray are:\n";
cout << floatArray;
cout << "\nThere are " << Array<int,5>::getArrayCount() << " Array<int,5> objects.\n";
cout << "\nThere are " << Array<float,5>::getArrayCount() << " Array<float,5> objects.\n";
return 0;
}
首先靜態(tài)成員變量count需要在類外定義。
其次,問題主要出在試圖將函數(shù)模板的某個(gè)特化聲明為類的友元,標(biāo)準(zhǔn)貌似不支持這個(gè)(具體的wording沒有找到)。同樣的效果可以通過簡(jiǎn)單的在類模板內(nèi)定義函數(shù)友元來(lái)實(shí)現(xiàn):
template <class T>
class X {
friend void foo(T) { /* ... */ }
};
或?qū)⒑瘮?shù)模板聲明為類模板的友元:
template <class T>
class X {
template <class U>
friend void foo(U);
};
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問,美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。