です。テンプレートから継承し、保護されたメンバーにアクセスできるテンプレートからクラスを派生させようとしています。テンプレートが展開される前に、それはテンプレートパラメータベース部材を使用することはできませんので、しかし、それは、これらの権利を持っていない:テンプレートを展開する前のテンプレートの基本クラスへのアクセスは、
using Fun = void (*)();
class Base {
protected:
// friend class Derived; // ...need this to eliminate complaint
static void something();
};
template<Fun F>
class Variant : public Base {};
class Derived : public Variant<&Base::something> { // `something()` is protected
public:
void somethingElse() {
something(); // doesn't complain about this `something()`
}
};
int main() {}
このことについて奇妙なビットを私にそれがすべてで働いていたfriendingということでした。助けにはならなかった
class Derived : public virtual Base, public Variant<&Base::something>
:私はバリアント前に、ベースから公開仮想継承を置くことによって「ドアに派生こっそり」可能性がある場合、私は疑問に思いました。
質問:ベース内のすべての派生クラスの明示的な言及を避けるためのいくつかの他のトリックがあるが、それでもテンプレートパラメータのためにそれから保護されたメンバーを選ぶためのアクセス権を持っていますか?
(注:。。でもfriendingが、その場合には助けにはならないような古いgccの、4.6.3でこれをしようとすると、見えます、そのためのサポートはやや新しいものであると思われるので)
関連:[CWG 372](http://wg21.cmeerw.net/cwg/issue372)および[CWG 580](http://wg21.cmeerw.net/cwg/issue580)。 clang ++とg ++の現在のバージョンでさえ、後者の欠陥に対して提案された解像度を実装していないようです。 – dyp
@dyp私はそれがおそらく "答え"であると思っています。それを1つにしたいですか? – HostileFork