- 論壇徽章:
- 2
|
20可用積分
下面幾行小程序,VC可以編譯過(guò),可是gcc,clang卻編譯不過(guò):
- template<class T>
- class Y
- {
- public:
- void f(){};
- };
- template<class T>
- class X:public Y<T>
- {
- public:
- X()
- {
- f();
- }
- };
- int main()
- {
- X<int> obj;
- return 0;
- }
復(fù)制代碼 GCC編譯提示:
D:\Documents\TestProjects\main.cpp|139|error: there are no arguments to 'f' that depend on a template parameter, so a declaration of 'f' must be available [-fpermissive]|
Clang編譯提示:
error: use of undeclared identifier 'f'
f);
我如果改成了Y<T>::f()這樣的調(diào)用,那就沒(méi)有問(wèn)題了。這是為什么呢,這個(gè)錯(cuò)誤是C++標(biāo)準(zhǔn)規(guī)定了的嗎?
問(wèn)題:
1. 對(duì)于普通類,而非模板類而言,直接調(diào)用基類定義的函數(shù),沒(méi)有問(wèn)題。為什么模板類需要我加上父類名稱?
2. 這樣一來(lái),我在模板類繼承體系中,凡是要調(diào)用父類的地方,豈不是都要顯示的使用父類名稱? 這種麻煩能否避免?
可能我理解的不到位,還請(qǐng)指針
謝謝。
|
最佳答案
查看完整內(nèi)容
是。。。處理模板時(shí)名字查找的方式不一樣。。。不能避免。。。 但除了Y::f()外還有其他方式表達(dá)想要調(diào)用基類的f。。。1. Y::f()2. this->f()3. using Y::f;為什么X構(gòu)造函數(shù)里寫(xiě)f()不表示調(diào)用繼承得到的f。。。 至少有這么一個(gè)原因。。。如果Y不是模板。。。 那Y一定有f函數(shù)。 但Y是類(主)模板。。。 這個(gè)就不一定了。。。 比如:Y 就有f, 而Y 就沒(méi)有。 于是 X就(通過(guò)繼承)有f, 而X 就沒(méi)有。只有用具體類型參數(shù)去實(shí)例化模 ...
|