1

コードが利用できないサードパーティのライブラリとやり取りするアプリケーションをデバッグしています。ヘッダーと .so のみが利用可能です。これで、デバッガーにロードして、サードパーティ ライブラリで宣言されたクラスのプライベート メンバーの変数値を確認できますが、オブジェクトの数が膨大であるため、後で分析できるコンソールに出力するメカニズムを作成したいと考えています。私はこのようなものを思いついた

サードパーティ ヘッダー

class A
{
    private:
    int i;
};

上記のクラスには追加の詳細を含めていません

Debugprinter.cpp

#include <thirdpartheaders>

template <typename T> class debugprinter
{
    friend class T;
    public :
    void printonconsole()
    {
        T a;
        std::cout << std::endl << a.i << std::endl;
        return;
    }
}

これでコンパイルしようとしましたが、未定義の型 T をテンプレート クラスのフレンドとして宣言できず、このエラーが発生するようです

エラー: i は x::acc() からアクセスできません

テンプレート以外の debugprinter を作成することでこの問題を解決できるようになりましたが、好奇心から、入力型パラメーターのフレンドになるテンプレート クラスを作成する方法はありますか?

ありがとう

4

3 に答える 3

5

Aの友人として宣言するのは役に立ちませんdebugprinter<A>friend関係は対称的ではありません。関係は一方通行です。のプライベート メンバーにアクセスするdebugprinter<A>には、 のフレンドになる必要があります。そのためには、クラス自体を変更する必要があります。AAA

現実世界の友情と同じです。他の誰かにあなたの友達になるよう強制することはできません。他人に友好的に振る舞えるのは自分だけです。

于 2013-09-23T12:38:29.963 に答える
2

最初のことは、他の人が言及したように、友情は対称的ではなく、間違った方向にしようとしているということです (へのAアクセスを許可しますdebugprinter<A>。そうは言っても、質問を検索する人々のために:

標準の古いバージョン (C++03) では、テンプレート引数をフレンドとして直接宣言することはできませんでした。この制限は C++11 で解除されましたが、構文が少し異なります。

template <typename T>
class test {
   friend T;             // note, not 'friend class T'!!!
};

それでも、C++03 では、間接化の追加レベルを 1 つ使用することで、同じ動作を実現できます。テンプレート引数と友達になることはできませんが、従属型と友達になることはidentityできます。メタ関数を使用することで、目的を達成できます。

template <typename T>
struct identity {
   typedef T type;
};
template <typename T>
class test {
   friend class identity<T>::type;
};
于 2013-09-23T12:59:52.297 に答える