C++ の template をいろいろと試してみているのだけど,その途中で唐突に
識別子が見つかりませんでした
と言われて「ちょっと意味わかんないですね…」ってなった.
↓の Deriv::F3()
がコンパイル通らない.
「 empty
って何すか?」とのことだ.
仕方ないので試しに F1()
とか F2()
のように「いや,だからコレだよコレ」という感じで書いてやると何事もなかったかのように通る.
template< class T >
struct Base
{
bool empty() const { return true; }
};
template< class T >
struct Deriv : public Base<T>
{
bool F1() const { return Base<T>::empty(); } //OK
bool F2() const { return this->empty(); } //OK
bool F3() const { return empty(); } //C3861 'empty': 識別子が見つかりませんでした
};
基底クラスの public なメンバが見えないとか,そんなことってないだろう!?
何やら派生元が Base<T>
という template な型であることが要因っぽいが……
こんなのでコンパイルエラーとか言われなかったような気がするんだよなぁ(←曖昧な記憶だけども).
何なのコレ?
…ということで,頑張って検索してみたところ,どうやら「/Permissive-(標準への準拠)」というページに書かれている話が該当する模様.
コンパイラに標準準拠モードを指定します。 このオプションを使用すると、コード内の準拠の問題を特定して修正し、より正確で移植性の高いものにすることができます。
とか書かれているので,「コンパイル通っていた(気がする)」という挙動の方がまちがい(?)というか 標準に準拠していなかった ということか.
仕方ない.片っ端から this->
って付けて回ることにするか.