简体   繁体   English

试图用模板编译嵌套类?

[英]Trying to compile a nested class with a template?

Basically what I want is to have a global variable GLOBAL_WRAPPER_TYPE within a class so that I can store any data type into it. 基本上,我想要的是在一个类中有一个全局变量GLOBAL_WRAPPER_TYPE ,以便可以在其中存储任何数据类型。 So far I have the code below which may have its faults but it compiles as long as you don't try to return anything from WRAPPED . 到目前为止,我下面的代码可能有错误,但是只要您不尝试从WRAPPED返回任何内容,它就可以编译。

I also wondered if my set function works properly and do I need to overload the = operator to retrieve the template type T from the WRAPPED class. 我也想知道我的set函数是否正常工作,是否需要重载=运算符才能从WRAPPED类中检索模板类型T。 I was having trouble getting the "extraction" of the GLOBAL_WRAPPER_TYPE to work and I don't know for sure if the set() function inside the WRAPPED class even does the job. 我在使GLOBAL_WRAPPER_TYPE的“提取”正常工作时遇到了麻烦,而且我不确定WRAPPED类中的set()函数是否能完成工作。 It compiles but runtime errors might occur (haven't run it yet). 它可以编译,但是可能会发生运行时错误(尚未运行)。

I did get a compiler error with the code... 我的代码确实出现了编译器错误...

nested_class_global_template.cpp|44|error: invalid use of nonstatic data member 'WRAPPER<NODE>::GLOBAL_WRAPPER_TYPE'|

Due to line 62 NODE temp = WRAPPING.INSIDE.get(); 由于第62行, NODE temp = WRAPPING.INSIDE.get(); but the code does compile without that line, I'm just unsure the set() function works. 但是代码可以在没有该行的情况下进行编译,我只是不确定set()函数是否起作用。

And finally I wanted to know how NODE* declared as a pointer would screw everything up seeing that its not static? 最后,我想知道将NODE*声明为指针是什么,因为看到它不是静态的会把一切搞砸了?

Heres the code. 这是代码。

#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:

     T GLOBAL_WRAPPER_TYPE;

    WRAPPER(){}
    ~WRAPPER(){}

    class WRAPPED
    {
        public:

        WRAPPED(){}
        ~WRAPPED(){}
        void set(T GLOBAL_WRAPPER_TYPE)
        {
            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;
};
int main()
{
    WRAPPER<NODE> WRAPPING;
    WRAPPING.INSIDE.set(NODE(99));


    NODE temp = WRAPPING.INSIDE.get();

    return 0;
}

EDITED this one works! 编辑这一作品!

    #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:

            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;
}

GLOBAL_WRAPPER_TYPE is a non-static member of WRAPPER but it's not a member of WRAPPED , you can't return WRAPPER::GLOBAL_WRAPPER_TYPE from WRAPPED. GLOBAL_WRAPPER_TYPEWRAPPER的非静态成员,但不是WRAPPED的成员,不能从WRAPPED返回WRAPPER::GLOBAL_WRAPPER_TYPE

You can either make WRAPPER::GLOBAL_WRAPPER_TYPE static. 您可以使WRAPPER::GLOBAL_WRAPPER_TYPE静态。

Note: Your set function sets GLOBAL_WRAPPER_TYPE to itself, not set to WRAPPER::GLOBAL_WRAPPER_TYPE 注意:您的set函数将GLOBAL_WRAPPER_TYPE设置GLOBAL_WRAPPER_TYPE自身,而不是设置为WRAPPER::GLOBAL_WRAPPER_TYPE

  void set(T GLOBAL_WRAPPER_TYPE)
  {
        GLOBAL_WRAPPER_TYPE = GLOBAL_WRAPPER_TYPE;  // Doesn't do what you think!!!
  }

Update from comment, you could make GLOBAL_WRAPPER_TYPE static member: 从评论更新,您可以将GLOBAL_WRAPPER_TYPE静态成员:

template <class T>
class WRAPPER
{
    public:    
     static T GLOBAL_WRAPPER_TYPE;
    //......
};

template <class T>
T WRAPPER<T>::GLOBAL_WRAPPER_TYPE;

Now you could access WRAPPER::GLOBAL_WRAPPER_TYPE directly. 现在,您可以直接访问WRAPPER :: GLOBAL_WRAPPER_TYPE。

 void set(T GLOBAL_WRAPPER_TYPE)
 {
       WRAPPER::GLOBAL_WRAPPER_TYPE = GLOBAL_WRAPPER_TYPE;
 }

Note: your variable names are very hard to read, better choose something better. 注意:您的变量名很难读,最好选择更好的名称。 Find a good C++ coding style guilde. 找到一个好的C ++编码样式。 :) :)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM