1

x.yこのコードでは、テンプレート パラメーターとして のアドレスを渡したいと思いますtypename Name::Type leValue

#include <iostream>
using std::cout;
using std::endl;

struct X {
   X() : y(123) {}
   const int y;
};

template<typename Name, typename Name::Type leValue>
void print() { cout << *leValue << endl; }

struct Foo {
   typedef int X::* Type;
};


int main() {
    X x;
    print<Foo, &x.y>();  // What is the right syntax here?
}

ただし、gcc 4.7.2 では、次のエラーが発生します。

source.cpp: 関数 'int main()':
source.cpp:22:5: エラー: テンプレート引数リストの解析エラー
source.cpp:22:22: エラー: 'print()' の呼び出しに一致する関数がありません
source.cpp:22:22: 注: 候補は:
source.cpp:11:6: 注: テンプレート void print()
source.cpp:11:6: 注: テンプレート引数の控除/置換に失敗しました:
source.cpp:22 :22: エラー: テンプレート引数 2 が無効です

代わりに typedef を に変更しtypedef int Type;、print 呼び出しをに変更するとprint<Foo, 3>();、機能します。エラー メッセージを見ていくつかのことを試しましたが、正しい構文を取得できませんでした。私もここで検索し、テンプレート クラスを扱ういくつかの有用な投稿を見つけましたが、テンプレート関数を扱うものはありませんでした。それらの回答を使用してみましたが、役に立ちませんでした。

この構文について教えてください。または、これを修正するために次に何をすべきかを説明してください。

4

3 に答える 3

2

これはあなたが探しているものに近いですか?

#include <iostream>
using std::cout;
using std::endl;

struct X {
   X() : y(123) {}
   const int y;
};

template<typename Name, typename Type, Type Name::*Member>
void print(Type& obj) { cout << obj.*Member << endl; }

int main() {
    X x;
    print<X, const int, &X::y>(x);
}
于 2013-02-04T15:57:55.340 に答える
1

のアドレスはx.yコンパイル時に不明です。テンプレート引数としてメンバーへのポインターを使用できますyが、実行時にオブジェクト インスタンスのアドレスを渡す必要があります。

于 2013-02-04T16:00:26.753 に答える
0

const int をテンプレート パラメーターとして渡すことが許可されているため、int に変更すると機能します。テンプレートでは、コンパイル時に解決する必要があるため、値を引数として渡すことはできません。

于 2013-02-04T15:59:45.587 に答える