это мой первый вопрос, я надеюсь, что все сделаю правильно.C++ Невозможно вызвать метод базового класса из производного класса
Я пытаюсь получить класс из форсированного кортежа. Кортежи 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
Вторая обратная линия была моей попыткой sc ОПЕ вызов метода в базовом классе:
return boost::tuple<A>::get<0>();
И это порождает различные ошибки
error: expected primary-expression before ')' token
Вызов внешней функции `подталкивания :: кортежи :: получить < 0> (* это) работает. И это обходное решение для меня в порядке. Но я все еще удивляюсь, почему я не могу использовать метод кортежа на этом этапе.
В документации повышающего это уведомление для Visual C++
Внимание! Функции-члены get не поддерживаются компилятором MS Visual C++. Кроме того, у компилятора есть проблемы с поиском функций, не входящих в члены, без явного определения пространства имен. Следовательно, все вызовы get должны быть квалифицированы как: tuples :: get (a_tuple) при написании кода, который должен компилироваться с MSVC++ 6.0.
Но я использую GCC 4.5.2 & 4.8.1
Заранее спасибо
+1 Я должен сказать следующее: в этом случае вопрос должен быть приведен в качестве примера любому новому пользователю, который размещает на этом сайте. У вас есть * все * необходимое для хорошего вопроса, в том числе (1) проблема, которую вы считаете у вас, (2) образец кода, который показывает эту проблему, (3) попытки решить проблему; (4) каждый результат этих (5) используемые вами инструменты, включая информацию о версии, и (6) исследование того, что, по вашему мнению, может быть проблемой root. Для должности в целом это потрясающе; для * первой * почты это просто выдающийся и редко встречается с такой доставкой. – WhozCraig
WhozCraig очень приятно, что вы можете дать новику так много хороших слов и положительных советов – 4pie0
@ piotruś Не сложно, когда будет опубликован такой вопрос. Я очень серьезно отношусь к этому образцово. Я просто надеюсь, что OP знает, как отметить решение, потому что я уверен, что у него есть Dietmar. = P – WhozCraig