7

これは私の最初の質問です。すべて正しく行うことを願っています。

ブーストタプルからクラスを派生させようとしています。Boost のタプルは、個々のフィールドにアクセスするための get() テンプレート メソッドを提供します。興味深いことに、派生クラス内からメソッドを使用することはできません。

次のコードは問題を示しています。

#include <iostream>
#include <boost/tuple/tuple.hpp>
using namespace std;

template<typename A>
class Derived : public boost::tuple<A>
{
public:
    Derived() : boost::tuple<A>() {}

    A& getVal0()
    {
        return get<0>();
        // does not compile:
        //error: 'get' was not declared in this scope

        return boost::tuple<A>::get<0>();
        // does not compile
        //error: expected primary-expression before ')' token

        return boost::tuples::get<0>(*this);
        //works
    }
};  

int main() {
    Derived<int> a;

    a.get<0>() = 5;

    cout << a.get<0>() << endl; 
    cout << a.getVal0() << endl; 
    return 0;
}

なぜget<0>()メイン関数からメソッドにアクセスできるのだろうか

a.get<0>() = 5;

A& getVal0()メソッド内からではありません:

error: 'get' was not declared in this scope

2 番目の戻り行は、メソッド呼び出しの範囲を基本クラスに限定しようとしたものです。

return boost::tuple<A>::get<0>();

そして、これは別のエラーを生成します

error: expected primary-expression before ')' token

外部関数 `boost::tuples::get<0>(*this) を呼び出すと機能します。そして、この回避策は私には問題ありません。しかし、この時点でタプルメソッドを使用できない理由はまだ疑問に思っています。

ブーストのドキュメントには、Visual C++ に関する通知があります。

ノート!メンバー取得関数は、MS Visual C++ コンパイラではサポートされていません。さらに、コンパイラは、明示的な名前空間修飾子なしで非メンバーの get 関数を見つけるのに問題があります。したがって、MSVC++ 6.0 でコンパイルする必要があるコードを記述する場合は、すべての get 呼び出しを tuples::get(a_tuple) として修飾する必要があります。

しかし、私はGCC 4.5.2 & 4.8.1を使用しています

前もって感謝します

4

1 に答える 1