4
クラスfoo
には、プライベートタプルメンバーが含まれています。私はgetElement<I>()
を使ってこのタプルの要素への参照を取得したいと思います。私は、このソリューションに来たが、オブジェクトが別のクラスbar
のコンストラクタに渡されたとき、それは動作しません。テンプレートメンバー関数によるプライベートタプル要素へのアクセス
#include <tuple>
template<class... Args>
class foo {
std::tuple<Args...> tup_;
public:
foo(Args... args) : tup_ {args...} {};
template<size_t I>
const typename std::tuple_element<I, std::tuple<Args...>>::type &
getElement() const {return std::get<I>(tup_);}
};
template<class T>
class bar;
template<class T, class U>
class bar<foo<T,U>> {
public:
bar(foo<T,U> f) {
auto j = f.getElement<0>(); // this is an ERROR!!! Line 22
}
};
int main()
{
foo<int, char> f(12,'c');
auto j = f.getElement<0>(); // but this is OK!
bar<decltype(f)> b(f);
return 0;
}
コンパイラの出力:
main.cpp: In constructor 'bar<foo<T, U> >::bar(foo<T, U>)':
main.cpp:22:33: error: expected primary-expression before ')' token
auto j = f.getElement<0>(); // this is an ERROR!!!
^
main.cpp: In instantiation of 'bar<foo<T, U> >::bar(foo<T, U>) [with T = int; U = char]':
main.cpp:32:24: required from here
main.cpp:22:29: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator<'
auto j = f.getElement<0>(); // this is an ERROR!!!
'f.template getElement <0>();' –
@PiotrSkotnickiありがとう、私はこの構文について知りませんでした。コンパイラにとってはどういう意味ですか? – Vahid