это мой первый вопрос, я надеюсь, что я делаю все правильно.
Я пытаюсь получить класс из кортежа повышения. Кортежи 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
Вторая строка возврата была моей попыткой ограничить вызов метода базовым классом:
return boost::tuple<A>::get<0>();
И это генерирует другую ошибку
error: expected primary-expression before ')' token
Вызов внешней функции `boost::tuples::get‹0>(*this) работает. И этот обходной путь меня устраивает. Но мне все еще интересно, почему я не могу использовать метод кортежа на данный момент.
В документации по ускорению есть уведомление для Visual C++.
Примечание! Функции получения члена не поддерживаются компилятором MS Visual C++. Кроме того, у компилятора возникают проблемы с поиском функций get, не являющихся членами, без явного квалификатора пространства имен. Следовательно, все вызовы get должны быть квалифицированы как: tuples::get(a_tuple) при написании кода, который должен компилироваться с помощью MSVC++ 6.0.
Но я использую GCC 4.5.2 и 4.8.1.
заранее спасибо