我是编程中的新手,并试图理解为什么这段代码无法编译。
#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'
谢谢!
答案 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 <
,它没有结束。