テンプレート基底クラスのエラーを修正2017年04月21日 13時41分32秒

C++ でテンプレートクラスを次の様に基底クラスにするとエラーがでる。
% cat template_base_class.cpp
#include <list>

template<typename T> class Vector : public std::vector<T>
{
public:
  int At(int i)
  {
    return at(i);
  }
};

gcc だと、 error: there are no arguments to `at' that depend on a template parameter, so a declaration of `at' must be available の様なエラーがでて、-fpermissive を渡すと、無視させて進めることが出来る。

llvm だと

template_base_class.cpp:8:14: error: use of undeclared identifier 'at'
      return at(i);
等となる。

なお、Solaris と AIX のコンパイラは大丈夫なようだ。

C++ もテンプレートなどが発展して、名前解決の規則が厳しくなり、しっかりと分かりやすくテンプレート基底クラスから、at が使われると明示してやる必要がある。

修正の仕方は三つ。

  1. this->at(i) として、メンバ関数を呼び出していると明示する。
  2. std::vector<T>::at(i) として、基底クラスから呼び出しているのを明示する。
  3. using std::vector<T>::at(i) をいれて、at は vector クラスのメンバ関数と明示する。
後の二つの方法だと、仮想関数を呼び出したい時には、基底クラスを呼び出すとしている為、うまく動作しない。今回は、std::vector を基底クラスにしたので、at 関数に virtual を付けて仮想関数にすることは出来ないので問題はないが。そこらも踏まえて修正するのであれば、this を用いた方法が最適だろう。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2017/04/21/8495361/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。