2

内部クラスのサイズでコンパイル時定数を公開する必要があります。そうするために、次のコードを試しました:

#include <cassert>

struct A
{
    //consider Private class as private for this example, just to be able to put the assert like this in main
    class Private{};
    enum { PrivateSize = sizeof(Private) };
};

int main()
{
    //here I have warning on some compilers, signed/unsigned comparison
    assert(A::PrivateSize == sizeof(A::Private));
}

私の問題は、PrivateSize一部のコンパイラで署名され、他のコンパイラでは署名されていないことです。署名された型と比較すると、これに関する警告が表示されます。私の知る限り、の基になる型は実装定義であり、強制的にorenumにすることはできません。signedunsigned

コンパイル時定数としてsizeof(A::Private)外部に公開する方法を知っていますが、クラスをプライベートに保ちますか? コードは一部の古いコンパイラで使用されるため、使用できないことに注意してください。APrivateconstexpr

4

1 に答える 1

4

次の作品:

struct A
{
    friend int main(int argc, char *argv[]); // For test purpose
private:
    class Private{};
public:
    static const unsigned int PrivateSize = sizeof (Private);
};

int main(int argc, char *argv[])
{
    assert(A::PrivateSize == sizeof(A::Private));
    return 0;
}
于 2014-01-30T14:28:34.817 に答える