模板类使用自身作为参数。 C ++

时间:2015-07-12 11:34:16

标签: c++ templates arguments

我是编程中的新手,并试图理解为什么这段代码无法编译。

#include <iostream>
#include <set>

template <class T>
class Parent {
    protected:
        std::set<T*>* list;
    public:
        Parent() {
            list = new std::set<T*>;
        }
        ~Parent() {}
};

int main() {
    Parent<Parent>* f = new Parent<Parent>;

    return 0;
}

我有这样的错误:

test5.cpp: In function 'int main()':
test5.cpp:23:18: error: type/value mismatch at argument 1 in template parameter
list for 'template<class T> class Parent'
test5.cpp:23:18: error:   expected a type, got 'Parent'
test5.cpp:23:23: error: invalid type in declaration before '=' token
test5.cpp:23:42: error: type/value mismatch at argument 1 in template parameter
list for 'template<class T> class Parent'
test5.cpp:23:42: error:   expected a type, got 'Parent'

谢谢!

4 个答案:

答案 0 :(得分:1)

你弄错了,编译器无法在编译时推断出类型T.没有类型Parent,有类型Parent,其中T可以是你想要的任何东西,int,class等等,例如

Parent< int >* f = new Parent< int >();

或(这取决于该列表应该做什么,但如果你想要一组相同的对象)

template <class T>
class Parent {
    protected:
        std::set< Parent<T> *>* list;
    public:
        Parent() {
            list = new std::set< Parent< T >*>;
        }
        ~Parent() {}
};

我认为你知道由于集合分配导致的内存泄漏,并且因为指向集合元素的指针而可能存在...

答案 1 :(得分:0)

因为Parent不是类而是类模板。它生成类。

出于同样的原因,你不能拥有std::vector<std::vector> v;

答案 2 :(得分:0)

你可以通过引入实际的类来克服这个模板与类的张力:

#include <iostream>
#include <set>

template <class T>
class Parent {
    protected:
        std::set<T*>* list;
    public:
        Parent() {
            list = new std::set<T*>;
        }
        ~Parent() {}
};

class Child : public Parent<Child> {
};

int main() {
    Child* f = new Child();

    return 0;
}

现在Child是一个可以实例化的类。它 list Child类型的对象。

答案 3 :(得分:0)

事实上,你无法定义Parent<Parent>;正确的方式可能看起来像Parent< Parent<Parent< Parent <,它没有结束。