template
class XClass
{
std::vector m_vec;
public:
//m_vecの最初の要素を指すイテレータを取得
std::vector::iterator GetBeginItr(){ return m_vec; } //エラー!!
};
これは、依存名というものの問題で、
上のNantokaクラスでいえば、typeが依存名で、
これがテンプレートクラスTに依存している、ということです。
これらのエラーは、この依存名のあいまいさから起こります。
上の例では、typeは「型」ですが、依存名は型だけでなく、変数、関数、何でもあります。
さきの例では、typeは型以外ありえませんから、コンパイラだって分かるだろうと思われるでしょうが、
次のような使い方の時、問題がおきます。 これが何がまずいか、というと、
仮に、typeがstatic変数であるとすると、
T::type* loval_ptr → (T::type) × (local_ptr)
という積の式に解釈できてしまうことです。
コンパイラはどちらか判別できないので、
エラーになってしまうということでした。
これを回避するには、T::typeが型であると明示する必要があります。
それを行う演算子が"typename"演算子です。
よって、次のようになります。
template
class Nantoka
{
//クラスTに定義された型typeの変数
typename T::type m_value;
public:
Nantoka(){}
};
T::typeが型であると判別することができます。
よって、最初の例に戻ると、
template
class XClass
{
std::vector m_vec;
public:
//m_vecの最初の要素を指すイテレータを取得
typename std::vector::iterator GetBeginItr(){ return m_vec.begin(); }
};
チャットで解決に尽力した方々 → バグさん、Chocolaさん、kerotanさん、nissyさん
参考:http://www.fides.dti.ne.jp/~oka-t/cppla ... ate-4.html