LoginSignup
0
0

templateでC3861

Posted at

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-> って付けて回ることにするか.

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0