正直なところ、私はその問題に名前を付ける方法を本当に知りません。動作していないコードを表示します。
template<int SIZE>
struct bar{
};
template<int SIZE>
struct foo{
template<int X>
void f(bar<X> b);
};
template<int SIZE, int X>
void foo<SIZE>::f(bar<X> b){
}
int main(){
foo<1> f;
bar<2> b;
}
循環依存の問題を回避するために、定義を実装から分離したいと思います。分離はヘッダーファイルでのみ行われます。テンプレートコードをcppファイルに入れたくありません。その場合、ポインタを使用することはできません。リファクタリングが検討されていますが、実際のオプションでもありません。
テンプレートパラメータ自体を持つパラメータなしでfoo::fを実装すると、正常に機能します。ただし、そのパラメータでは実際には問題は発生しません。
コードはgcc4.7および(さらに重要な)Visual Studio2010を使用して機能するはずです。C++11は、前述のプラットフォームでサポートされている限り問題ありません。
解決策、回避策、および私が完全に間違ったことをしている理由の理論的説明は高く評価されます。TIA。