次の例を考えてみましょう:
#include <iostream>
#include <typeinfo>
template< int N, typename T >
struct B
{
struct C;
};
template< typename T >
struct B< 0, T >::C
{
typedef T type;
};
template< int N, typename T >
struct B< N, T >::C
{
typedef T type[N];
};
int main()
{
std::cout<<"n=0 type = " << typeid( B< 0, float >::C::type ).name() << std::endl;
std::cout<<"n=5 type = " << typeid( B< 5, float >::C::type ).name() << std::endl;
}
g++ (バージョン 4.3.0) を使用してコンパイルした場合
g++ dfg.cpp -ansi -pedantic -Wall
コンパイルエラーは次のとおりです。
dfg.cpp:13: error: qualified name does not name a class before ‘{’ token
dfg.cpp: In instantiation of ‘B<0, float>::C’:
dfg.cpp:25: instantiated from here
dfg.cpp:20: error: ISO C++ forbids zero-size array
私が実際にアーカイブしようとしているのは、列挙値に応じて異なる Imp 実装を持つことです (この例では、列挙型の代わりに int を使用しましたが、問題にはなりません)。
これが許可されていない理由を誰かが説明できますか? 最初のエラーが発生するのはなぜですか? (これ: 修飾名は '{' トークンの前にクラスを指定しません)
テンプレートパラメータに依存するpimplの実装に関して、私は新しい質問を作成しました(より良い例で)here