3

継承に問題があります。この例を作成して、私の問題を多かれ少なかれ示しました。問題は、クラスから公に派生するクラスから公に派生する場合、元のクラスの保護されたメンバーにずっとアクセスできる必要があるということです。ただし、テンプレートを使用している場合はそうではないようです。

実際、以下の例では、「n++;」の行で問題が発生しています。「n」がスコープで宣言されていないと言っています。ただし、テンプレートなしで行うと。コードは問題なくコンパイルされます。何が起こっている?

#include<iostream>
template<typename T> 
class base{
 protected:
    T n;
 public:
    T getn();
    base();
};

template<typename T>  
T base<T>::getn(){
   return n; 
}

template<typename T> 
base<T>::base(){
   n = 8; 
}

template<typename T> 
class daddy: public base<T>{
protected: 
public:
};

template<typename T>
class granny: public daddy<T>{
protected:
public:
    T plusone();
};

template<typename T> 
T granny<T>::plusone(){ 
    //this->n = this->n + 1;
   n++;
   return n;
}

int main(){
   granny<int> oldmommy;

   int su = oldmommy.getn();   
   std::cout << su << std::endl;
   su = oldmommy.plusone();
   std::cout << "plusone" << su << std::endl;
   return 0;
}

ところで。比較するテンプレートなしでコードを投稿する必要があるかどうか教えてください..

4

2 に答える 2

3

簡単な修正はthis、変数の前に適用することです。

 this->n = this->n + 1;
 return this->n;

その理由はn、これらのメンバーの一部を含まない基本クラスの部分的な特殊化がある場合に、コンパイラがテンプレート基本クラスのメンバー (この場合、型 T に依存する) について何も仮定しないためです。

于 2013-04-09T02:00:42.183 に答える
2

nここでは従属名です。nそれがどこから来たのかを明示的に示さなければなりnませbasen

これは、次を使用して実現できます。

this->n;

または:

base<T>::n;

nコードの代わりに。

于 2013-04-09T02:00:35.537 に答える