3

それはバグですか、それともテンプレートについてまだ何かわかりませんか? もしそうなら、なぜこのような結果になるのか、また何ができるのでしょうか?

最初の 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`
                       ]
4

0 に答える 0