C++20で準拠モードが「はい」だと、以下のコードで C2065, C3861 が発生する。C++14では発生しない。
template<typename T>
struct Hoge
{
T a ;
T b ;
} ;
template<typename T>
struct DerivedHoge
: Hoge<T>
{
T GetA() const
{
return a ;
}
T GetB() const
{
return b ;
}
} ;
using DerivedHogeD = DerivedHoge<double> ;
void func()
{
DerivedHogeD a ;
a.GetA() ;
a.GetB() ;
}
テンプレートだと、DerivedHoge側で親の変数であるaとbを認識できないことが原因らしい。準拠モードを「いいえ」にすれば回避できるが、C++のバージョンが上がるたびに厳しくなっているようなので、いたちごっことなってしまう。
コード上の対処法としては、以下の2つがある。
- __super::をつける
- usingをつける
template<typename T>
struct DerivedHoge
: Hoge<T>
{
using Hoge<T>::b ; // ここ
T GetA() const
{
return __super::a ; // ここ
}
T GetB() const
{
return b ;
}
} ;
では。
