2

WRAPPEDクラス内にある型のオブジェクトを宣言しようとしていますがWRAPPED、そのクラスWRAPPEDは という別のクラスに含まれていますWRAPPER。これらのコンパイラ エラーが発生します。

nested_class_incomplete_type.cpp|56|instantiated from 'WRAPPER<NODE>'|
nested_class_incomplete_type.cpp|62|instantiated from here|
nested_class_incomplete_type.cpp|36|error: 'WRAPPER<T>::WRAPPED::WRAP' has incomplete type|
nested_class_incomplete_type.cpp|33|error: declaration of 'class WRAPPER<NODE>::WRAPPED'|

これも試してみましWRAPPER::WRAPPED WRAP;たが、まったく同じエラーが発生します。クラスがクラスの外に存在する場合、これは通常問題になりませんWRAPPEDが、何らかの理由で、そのような単純なオブジェクトを宣言することはできません。C++ コンパイラのセマンティクスと神 Stroustrup の魔法の世界について教えてください。コードはこちら。

#include <iostream>

using namespace std;

class NODE
{
        int data;

    public:

        NODE(){}
        ~NODE(){}
        NODE(int data)
        {
            this->data = data;
        }
        void print()
        {
            std::cout<<"data: "<<this->data<<std::endl;
        }
};
template <class T>
class WRAPPER
{
    public:

        static T GLOBAL_WRAPPER_TYPE;

    WRAPPER(){}
    ~WRAPPER(){}

        class WRAPPED
        {
            public:

            WRAPPER::WRAPPED WRAP;

            WRAPPED(){}
            ~WRAPPED(){}
            void set(T GLOBAL_WRAPPER_TYPE)
            {
                WRAPPER::GLOBAL_WRAPPER_TYPE = GLOBAL_WRAPPER_TYPE;
            }
            T& get()
            {
                return GLOBAL_WRAPPER_TYPE;
            }
            WRAPPED& operator=(const WRAPPED &INSIDE)
            {
                GLOBAL_WRAPPER_TYPE = INSIDE.GLOBAL_WRAPPER_TYPE;

                return *this;
            }
        };

        WRAPPED INSIDE;
};
template <class T>
T WRAPPER<T>::GLOBAL_WRAPPER_TYPE;
int main()
{
    WRAPPER<NODE> WRAPPING;
    WRAPPING.INSIDE.set(NODE(99));
    NODE temp = WRAPPING.INSIDE.get();
    temp.print();

    return 0;
}
4

1 に答える 1

7

基本的に、あなたがやろうとしていることは次のとおりです。

class A
{
    A a;
};

int main()
{
    A a;
    return 0;
}

(ここで同じエラーが発生することがわかります)

これは無限再帰です。それ自体を使用して型を定義しています。次のように、代わりにポインターを使用します。

class A
{
    A* a;
};

int main()
{
    A a;

    return 0;
}

ここでわかるように、これはコンパイルされます。

于 2013-07-29T14:43:57.947 に答える