単なるサンプルコード:
template <class T> class TempBase
{
protected:
string m_str;
};
template <class T> class Temp: public TempBase<T>
{
public:
void method()
{
string
&s = TempBase<T>::m_str //reference works fine
/*NOTE compile failed:
error: ‘std::string TempBase<int>::m_str’ is protected
error: within this context
error: cannot convert ‘std::string TempBase<int>::* {aka std::basic_string<char> TempBase<int>::*}’ to ‘std::string* {aka std::basic_string<char>*}’ in initialization
*/
, *ps = &TempBase<T>::m_str
, *ps2 = &m_str //compile failed, obviously: ‘m_str’ was not declared in this scope
, *ps3 = &s //this is workaround, works fine
;
}
};
void f()
{
Temp<int> t;
t.method();
}
std::string *
目標:祖先 member を持つ型の init ポインターTempBase<T>::m_str
。
問題: 正しい構文が不明
コメント: 前のコードには 2 つの意図的なコンパイル エラーが含まれています。
- メンバ ポインタをデータ ポインタに変換しようとしています
- テンプレート化された祖先メンバーは完全に修飾されている必要があります
そして1つの回避策。
質問: この場合、祖先データへのポインターを取得するための正しい構文は何ですか?