1

std::function から単純な関数ポインタを取得しようとしています。このタスクは SO で何度も議論されており (ここのように)、解決できないと認められました。しかし、私はそのような解決策を試しました(単純にするために、関数ポインターの署名を修正し、単純な関数ポインターの使用を退化させました):

#include <functional>

typedef int(*fp)(int);

template<int idx, typename F>
struct wrap_f_struct {
    static F impl;

    static int f(int a) { return impl(a); }    
};

template<int idx, typename F>
fp wrap_f(F f) { 
    wrap_f_struct<idx, F>::impl = f;
    return wrap_f_struct<idx, F>::f;
}

int add(int a, int b) { return a + b; }

int main() {
    using namespace std::placeholders; 
    std::function<int(int)> add2 = std::bind(add, _1, 2);

    (wrap_f<1>(add2))(1);
}

まあ、これは私が理解できない何らかの理由でリンクしていません:

/tmp/ccrcFz32.o: In function `int (*wrap_f<1, std::function<int (int)> >(std::function<int (int)>))(int)':
cast_fp_min.cpp:(.text._Z6wrap_fILi1ESt8functionIFiiEEEPS1_T0_[_Z6wrap_fILi1ESt8functionIFiiEEEPS1_T0_]+0x10): undefined reference to `wrap_f_struct<1, std::function<int (int)> >::impl'
/tmp/ccrcFz32.o: In function `wrap_f_struct<1, std::function<int (int)> >::f(int)':
cast_fp_min.cpp:(.text._ZN13wrap_f_structILi1ESt8functionIFiiEEE1fEi[_ZN13wrap_f_structILi1ESt8functionIFiiEEE1fEi]+0x10): undefined reference to `wrap_f_struct<1, std::function<int (int)> >::impl'
collect2: error: ld returned 1 exit status

私の質問は、このリンケージ エラーが発生する正確な理由を説明してもらえますか?

4

1 に答える 1

1

静的メンバー変数は、構造体/クラスでのみ宣言されます。それらも定義する必要がありますが、あなたはそれを行いません。

例を追加

template<int idx, typename F>
F wrap_f_struct<idx, F>::impl;
于 2013-10-13T17:43:23.613 に答える