検討:
struct foo
{
void foobar(){}
};
struct bar : protected foo
{
using foo::foobar;
};
int main()
{
bar b;
b.foobar(); // Fine
&bar::foobar; // Not fine
}
宣言を使用してメンバーを公開できるようにする理由は何なのか疑問に思っていますが、それへのポインターは公開しません。実際、公開された関数のアドレスを取得することを除いて、アクセスレベルを変更する宣言を使用することはすべて機能するように思われます。
更新:私の実際の使用例によりよく似た例:
#include "boost/bind.hpp"
struct foo
{
void foobar() {}
};
struct bar : protected foo
{
using foo::foobar;
bar() { boost::bind( &bar::foobar, this )(); } // Crashes VS2008, GCC 4.1.1 fails to compile as it tries to go through foo*
};
int main()
{
bar b;
}
ただし、Mike Seymours の説明は的を射ており、GCC が失敗する理由を説明しています。ありがとう!