1

C++ テンプレート クラスを試してみましたが、クラス A の val にアクセスできないことがわかりました。テンプレートを使用しない場合は、アクセスしても問題ありません。メイン関数では、この動作は本当に奇妙です。誰かが理由を知っていますか?

#include <iostream>
#include <cstdio>
#include "name.h"
#include <map>
using namespace std;

template<class T>
class A {
    public:
        T val;
        A(T obj) {
            val = obj;
        }
        virtual void print() {
            cout << "in A" << endl;
        }
};

template<class T>
class B: public A<T> {
    public:
        B(T obj):A<T>(obj) {
        }
        void print() {
//if you unccomment this line, this program can't be compiled,
//            cout << val << endl;
            cout << "in B" << endl;
        }
};

int main() {
    string str = "`12";
    B<string> * b = new B<string>(str);
    A<string> * a = (A<string> *) b;
    b-> print();
    a-> print();
    cout << a-> val << endl;
//but it is ok to access val like this
    cout << b-> val << endl;
    return 0;
}
4

1 に答える 1

4

として参照する必要がありますthis->val。これは、非依存型valとして知られているためです。

または、事前にを使用するusing A<T>::valか、 で参照することもできA<T>::valます。

C++ FAQ では、これについて (やや) 詳細な説明が提供されています。

于 2013-05-10T04:43:23.800 に答える