テンプレート基底クラスのエラーを修正 ― 2017年04月21日 13時41分32秒
% 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 が使われると明示してやる必要がある。
修正の仕方は三つ。
- this->at(i) として、メンバ関数を呼び出していると明示する。
- std::vector<T>::at(i) として、基底クラスから呼び出しているのを明示する。
- using std::vector<T>::at(i) をいれて、at は vector クラスのメンバ関数と明示する。
最近のコメント