Я использую Visual Studio 2010.Получить указатель на метод класса с «помощи» ключевым словом
Почему я не могу получить указатель на метод класса, который был «модернизированный» публика в классе ребенка?
Следующий код не компилируется:
#include <iostream>
#include <functional>
class Parent {
protected:
void foo() {
std::cout << "Parent::foo()\n";
}
};
class Child : public Parent
{
public:
//void foo() { Parent::foo(); } //This compiles
using Parent::foo; //This does NOT compile
};
int main() {
Child c;
std::function < void() > f = std::bind(&Child::foo, &c);
f();
return 0;
}
Это дает ошибку:
error C2248: 'Parent::foo' : cannot access protected member declared in class 'Parent'
Это разные методы. использование Parent :: foo делает псевдоним Parent :: foo as Child :: foo, и публика делает это так, чтобы каждый мог получить доступ к псевдониму: он не делает ничего, чтобы изменить Parent :: foo. – IdeaHat
Не знаю, в чем проблема, но, может быть, использовать совместимый компилятор, созданный в этом десятилетии? [См. Это вживую.] (Http://ideone.com/vzEj2y). Вы говорите, что используете VS2010, возможно, обновите его до 2012 года (с ноябрьским 2012 CTP). Или подходящий gcc или clang (но если ваш VS-участник, это маловероятно). – WhozCraig
Код компилируется под TDM-GCC (MINGW) 4.7.1, когда удаляется строка 'std :: function < void() > f = std :: bind (& Child :: foo, &c);' (ошибка: 'function' не является членом станд). –