解決方式是 用this來調用父類成員。

那麼, 如何理解問題產生的原因, 及為什麼用this調用就可以呢?謝各位大神。


C++的模板中的名稱會進行兩次查找,稱為兩階段查找(two-phase lookup)。

對於一個非依賴型名稱(不以任何方式依賴於模板參數的名稱),在模板聲明進行解析的時候就會進行查找。但C++標準中規定(14.6.2 3),一個非受限的名稱查找的時候將不會考慮依賴型的基類。所以

template&

struct B { int x; };

template&

struct X : B& { void foo() { x = 0; }};

查找不到就會錯誤。解決辦法是把它變成一個依賴型名稱:

template&

struct B { int x; };

template&

struct X : B& { void foo() { this-&>x = 0; }

// this是依賴型名稱

};

或者

template&

struct B { int x; };

template&

struct X : B& { void foo() { B&::x = 0; } // B&是依賴型名稱};

為什麼要這麼做(兩階段查找),我想大概有這麼幾個原因:

1 提前發現錯誤2 為了分離模板(這個理由已經失去價值)不過它也有缺點:1 讓C++變得更加令人不知所措我的印象中VC現在都沒有完全支持兩階段查找,輪子哥的回答似乎也證實了這一點。誰知道為什麼呢。。
用this可讀性不高,可以用這種辦法

template &
class B
{
protected:
T data_;
};

template &
class D : public B&
{
public:
void test() {
do_something(B&::data_);
}
};


類模板能夠承繼也能夠被承繼。

1.在一個類模板中,一個非依靠型基類是指:無須知道模板實參就能夠徹底確定類型的

基類。

例如:

template&

class Base{

public:

int basefield;

typedef int T;

};

class D1:public Base& &>{//實際上不是模板

public:

void f(){basefield = 3; }

};

template&

class D2:public Base&{

public:

void f() { basefield = 7; }//正常訪問承繼成員

T strange;//T是Base&::T,而不是模板參數

};

留意事項:關於模板中的非依靠類型而言,假如在他的派生類中查找一個非受限稱號,

那就會先查找這個非依靠型基類,然後才會查找模板參數列表。

2.非依靠性稱號不會在依靠基類中查找

template&

class Base{

public:

int basefield;

typedef int T;

};

template &

class DD:Base&{

public:

void f(){

basefield = 0;//problem

}

};

template&

class Base&{

public:

enum { basefield = 42 };//tricky

};

void g(DD& d){

d.f();//opps

}

//修正計劃一

template &

class DD1:Base&{

public:

void f(){

this-&>basefield=0;//查找被延遲了

}

};

//修正計劃二

template &

class DD2:Base&{

public:

void f(){

Base&::basefield=0;//查找被延遲了

}

};

假如運用修正計劃二,假如原來的非受限非依靠型稱號是被用於虛函數調用的話,

那麼引進依靠性的限制的話,那麼這種引進依靠性的限制將會近之虛函數調用,

從而也會改動程序的意義,當遇到第二種情況不適合的情況,能夠選用計劃一隻聽過,模板類,非類型形參,
非模板類和非類模板類應該是指不是模板類的一般類吧

模板是以template開端命名的函數或者類,比方
template& class A{T a;} 表明聲明一個稱號為A的模板類,其間的參數T是模板形參,他能夠是int, float, char等,具體是什麼類型,在類A創建目標的時分決議。比方 A& m;聲明一個模板形參為int的類A的目標m,這時類A中的T a;中的a就是int型;同理A& n;表明聲明一個模板形參為float的目標n

非類型形參,指的是模板中的模板形參不是運用class關鍵字界說的,而是運用C 內置類型界說的形參,比方template& class B{},其間的形參a就是非類型形參,他是運用的內置類型int聲明的。

同理函數模板也有必要以template關鍵字開端,比方
template & void g(T a){}等。
留意:非類型模板形參一般不能用於模板函數中,當然你也能夠運用沒有強制規則


和一般的類界說靜態成員相同,只不過要加上模板的聲明。template &struct template_class {static int static_member;};template &int template_class&::static_member = 1;你的問題:data(ArrayInt(yr,y),ArrayInt(bot,y) )為什麼能夠這麼寫?data的括弧裡邊應該是兩個ArrayInt的object,比方能夠ArrayInt a,b; 然後再data(a,b)。可是ArrayInt(yr,y)和ArrayInt(bot,y)自身是結構函數,並不是實實在在的目標。
你都知道ArrayInt(yr,y)是一個結構函數了,結構函數回來的就是一個目標啊!莫非你一定要ArrayInt a = ArrayInt(yr,y); ArrayInt b = ArrayInt(bot,y);然後再data(a,b)才幹了解么?
c 和java有點差異:java調用結構函數前面就需要加new ArrayInt a = new ArrayInt(yr,y)別搞混了
吐槽一下= =模板類 我以為是java的模板方法模式,父類調用子類的方法。
和一般的類界說靜態成員相同,只不過要加上模板的聲明。template &struct template_class {static int static_member;};template &int template_class&::static_member = 1;只聽過,模板類,非類型形參,
非模板類和非類模板類應該是指不是模板類的一般類吧

模板是以template開端命名的函數或許類,比方
template& class A{T a;} 表明聲明一個名稱為A的模板類,其間的參數T是模板形參,他可所以int, float, char等,具體是什麼類型,在類A創立目標的時分決議。比方 A& m;聲明一個模板形參為int的類A的目標m,這時類A中的T a;中的a就是int型;同理A& n;表明聲明一個模板形參為float的目標n

非類型形參,指的是模板中的模板形參不是運用class關鍵字界說的,而是運用C 內置類型界說的形參,比方template& class B{},其間的形參a就是非類型形參,他是運用的內置類型int聲明的。

同理函數模板也有必要以template關鍵字開端,比方
template & void g(T a){}等。
留意:非類型模板形參一般不能用於模板函數中,當然你也能夠運用沒有強制規則


推薦閱讀:
相关文章