4

print_private_template次のコードで、コンパイラが不平を言っている間に関数を作成できる理由がわかりませんprint_private_class

#include <cstdio>

class A
{
    private:
        template <unsigned T>
        struct B
        {

        };

        struct C
        {

        };

    public:
        template <unsigned T>
        B<T> getAb()
        { 
            return B<T>();
        }

        C getAc()
        { 
            return C();
        }
};

template<unsigned T>
void print_private_template(const A::B<T> &ab)
{
    printf("%d\n", T);
}

void print_private_class(const A::C &ac)
{
    printf("something\n");
}

int main(int, char**)
{
    A a;

    print_private_template(a.getAb<42>());

    print_private_class(a.getAc());

    return 0;
}

これは予想される動作ですか?コンパイラのバグ/拡張機能?

明確にするために、私の目標は、 と の両方の使用でコンパイラ エラーを発生させることです 。print_private_templateprint_private_class

4

3 に答える 3

2

Comeauprint_private_classはエラーを出します (厳密な C++03 モードで関数とその呼び出しをコメントアウトすると.

ComeauTest.c(31): エラー: クラス テンプレート "A::B" (7 行目で宣言) にアクセスできません void print_private_template(const A::B &ab) ^ テンプレート引数 <42U> に基づく "print_private_template" のインスタンス化中に検出されました45行目

ただし、Windows 上の G++ 4.5 ではエラーは報告されません-std=c++ -Wall -pedantic

クラスA::Cとクラス テンプレートA::B<T>はどちらも、他の通常のメンバーと同じ可視性を持っています。したがって、 と の両方print_private_classprint_private_template診断が必要です。

11.8 ネストされたクラス[class.access.nest]

1ネストされたクラスはメンバーであり、他のメンバーと同じアクセス権を持ちます。外側のクラスのメンバーには、ネストされたクラスのメンバーへの特別なアクセス権はありません。通常のアクセス規則 (第 11 条) に従うものとします。

于 2010-09-24T06:30:21.760 に答える