试图用模板编译嵌套类?

时间:2013-07-29 01:28:06

标签: c++ templates global-variables nested-class

基本上我想要的是在一个类中有一个全局变量GLOBAL_WRAPPER_TYPE,这样我就可以在其中存储任何数据类型。到目前为止,我有下面的代码可能有它的错误,但只要你不尝试从WRAPPED返回任何内容它就会编译。

我也想知道我的set函数是否正常工作,我是否需要重载=运算符以从WRAPPED类中检索模板类型T.我无法使GLOBAL_WRAPPER_TYPE的“提取”工作,我不确定set()类中的WRAPPED函数是否能完成工作。它编译但可能发生运行时错误(还没有运行它)。

我的代码确实出现了编译错误...

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

由于第62行NODE temp = WRAPPING.INSIDE.get();但代码确实在没有该行的情况下编译,我只是不确定set()函数是否有效。

最后我想知道如果NODE*声明为一个指针会让所有东西都被看作是非静态的?

继承代码。

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

编辑这个有效!

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

1 个答案:

答案 0 :(得分:1)

GLOBAL_WRAPPER_TYPEWRAPPER的非静态成员,但它不是WRAPPED的成员,您无法从WRAPPED返回WRAPPER::GLOBAL_WRAPPER_TYPE

您可以将WRAPPER::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!!!
  }

从评论更新,您可以使GLOBAL_WRAPPER_TYPE静态成员:

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

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

现在您可以直接访问WRAPPER :: GLOBAL_WRAPPER_TYPE。

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

注意:你的变量名很难读,最好选择更好的东西。找一个好的C ++编码风格guilde。 :)