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>();
、機能します。エラー メッセージを見ていくつかのことを試しましたが、正しい構文を取得できませんでした。私もここで検索し、テンプレート クラスを扱ういくつかの有用な投稿を見つけましたが、テンプレート関数を扱うものはありませんでした。それらの回答を使用してみましたが、役に立ちませんでした。
この構文について教えてください。または、これを修正するために次に何をすべきかを説明してください。