それはバグですか、それともテンプレートについてまだ何かわかりませんか? もしそうなら、なぜこのような結果になるのか、また何ができるのでしょうか?
最初の 2 つの前方宣言を削除すると、BARef 定義の場所で同じエラーが発生します。
template<typename T,
unsigned int blockInitSize,
unsigned int blockMaxSize>
struct BAInternalIndex;
template<typename T,
unsigned int blockInitSize,
unsigned int blockMaxSize,
BAInternalIndex<T, blockInitSize, blockMaxSize>* (&getIndexPointer) (const T&)>
class BARef;
template<typename T,
unsigned int blockInitSize,
unsigned int blockMaxSize>
struct BAInternalIndex
{
template<typename T2,
unsigned int blockInitSize2,
unsigned int blockMaxSize2,
BAInternalIndex<T2, blockInitSize2, blockMaxSize2>* (&getIndexPointer2) (const T2&)>
friend class BARef;
};
error C3855: 'BARef': template parameter 'getIndexPointer' is incompatible with the declaration
Visual C++ 9.0 および 11.0 でコンパイルしようとしました。
最小限の例 / SSC(n)CE:
template<typename T>
struct A;
template<typename T, void(&fun)(A<T>)>
class B;
template<typename T>
struct A
{
template<typename T2, void(&fun)(A<T2>)>
friend class B; // line 11
}; // line 12
int main()
{
A<int> a; // line 16
}
VS2010 (v10) エラー出力:
(11 行目) エラー C3855: `B`: テンプレート パラメーター `fun` は、 宣言 (12 行目) クラス テンプレートのインスタンス化 `A` への参照を参照してください。 編集済み (11 行目) エラー C3855: `B`: テンプレート パラメーター `fun` は、 宣言 (16 行目) クラス テンプレートのインスタンス化 `A` への参照を参照してください。 編集済み と [ `T=int` ]