3

foo1 へのテンプレート パラメーターとしてメンバーへのポインターを取得します。コードは次のとおりです。

struct baz{
    int qux;
};

template<typename C, typename T, T C::*m>
struct foo1{};

template<typename C, typename T>
void barr2(T C::*m){
}

template<typename C, typename T>
void barr1(T C::*m){
    barr2(m); // ok
    foo1<C, T, &baz::qux> _; // ok
    foo1<C, T, m> f; // g++4.6.1 error here; how to pass 'm' correctly ?
}

int main(){
    barr1(&baz::qux);
}

それで、それはどのように見えるべきですか?

4

1 に答える 1

7

コンパイル時の式で実行時の情報を使用しようとしているため、うまくいきません。コンソールから読み取った整数を使用してテンプレートを特殊化するのと同じです。動作するためのものではありません。

必ずしも問題が解決するとは限りませんが、barr1関数の目的がタイピングの負担を軽減することである場合、次のようなものがうまくいく可能性があります。

struct baz{
    int qux;
};

template<typename C, typename T, T C::*m>
struct foo1 {};

#define FOO(Class, Member)                                  \
    foo1<Class, decltype(Class::Member), &Class::Member>

int main(){
    FOO(baz, qux) f;
}
于 2012-06-24T23:55:59.510 に答える