2013-09-23 115 views
1

我正在調試與其代碼不可用的第三方庫進行交互的應用程序,只有頭文件和.so文件可用。現在我可以將它加載到調試器中,並檢查在第三方庫中聲明的類的私有成員的變量值,但由於對象數量巨大,我想創建一些機制將其打印在控制檯上,以供我稍後分析。 我想出了這樣的事情將模板參數作爲模板類的朋友

ThirdPartyHeader

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作爲我的模板類的朋友,並得到這個錯誤

錯誤:我是不是從X :: ACC()

現在我可以通過創建非模板debugprinter但只是出於好奇解決此問題訪問是有辦法,我可以創建一個模板類,它會是它的輸入類型參數的朋友?

感謝

+0

如果您不能修改'A'有'debugprinter'作爲朋友,沒有標準的解決方案來訪問'A'的私人成員。您可以使用的所有技術都是未定義行爲。 – syam

回答

2

的第一件事就是爲其他人所說的友誼是不是對稱的,你正試圖以錯誤的方向(授予A訪問debugprinter<A>話雖這麼說,只是爲人們通過提問搜索緣故。

在老版標準(C++ 03)這是不可能直接申報模板參數作爲一個朋友說,取消了限制在C++ 11,儘管這需要一個稍微不同的語法:

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

儘管如此,在C++ 03中,您可以通過使用一個e來實現相同的行爲間接水平。你不能交好一個模板參數,但可以親近依賴型,並通過使用identity元的功能,你可以達到你想要的東西:

template <typename T> 
struct identity { 
    typedef T type; 
}; 
template <typename T> 
class test { 
    friend class identity<T>::type; 
}; 
3

你可以聲明T作爲一個朋友,但它不會給你帶來任何好。我們需要的是一種讓您的模板獲取T中的私人數據的方式,反過來:T必須將您的模板聲明爲朋友。關於友誼的決定是由提供友誼的階級決定的;它不能被另一個班級所要求。沒有朋友的聲明,沒有合法的方法從外面看班級的私人部分;這就是私人手段。

+0

不,我不能將T聲明爲模板類的朋友類,因爲朋友聲明需要詳細說明類型說明符 – anonymous

+0

但是,您得到的錯誤消息的原因並不是朋友聲明不起作用,但即使它工作,它也會不幫你。 – Hulk

4

作爲debugprinter<A>的朋友宣佈A無濟於事。 friend關係不對稱。關係只是單向的。如果您想訪問A的私人會員,您將需要debugprinter<A>成爲A的好友。爲此,您需要修改類A本身。

這就像現實世界的友誼。你不能強迫別人成爲你的朋友。你只能對自己的行爲友好。