エラー「Implicit instantiation of undefined template」の原因

C++で特定のクラスを利用すると、稀に以下のようなエラーが発生する。

// Implicit instantiation of undefined template 'std::__1::array<int, 3>'
std::array<int, 3> ary;

原因

ヘッダーファイルがインポートされていないことが原因。クラスに対応するヘッダーをきちんとインポートすれば良い。

#include <array>
std::array<int, 3> ary; // OK

根本原因

クラスの定義が見つからないことが原因。

std::stringstreamクラスなどはiosfwdヘッダファイル側でtypedefによる前方宣言がされているが、実際の実装はsstreamヘッダで定義されているので、そちらをインクルードする必要がある。

/* iosfwd.h */
typedef basic_stringstream<char> stringstream;

/* sstream.h */
template <class Char, class Traits, class Allocator>
class basic_stringstream : public basic_iostream<Char, Traits> {}

ちなみに

No member named 'array' in namespace 'std'

というエラーにならないのは、arrayクラスが前方宣言されているため(標準ライブラリ側で暗黙的に前方宣言されている場合がある)

実際にMyArrayというクラスを前方宣言のみ行い、実体は未定義の状態でコンパイルしてみると、今回と同様のエラーが発生する。

// 前方宣言
template <class _Tp, size_t _Size> struct MyArray;
// 定義省略
// template <class _Tp, size_t _Size> struct MyArray {};

/// Implicit instantiation of undefined template 'MyArray<int, 3>'
MyArray<int, 3> ary;
広告