C++ 什么';使用模板有什么问题?
这是我第一次在类中使用模板。这是我的计划 MyCairoControl.h:C++ 什么';使用模板有什么问题?,c++,templates,C++,Templates,这是我第一次在类中使用模板。这是我的计划 MyCairoControl.h: #ifndef _MYCAIROCONTROL_ #define _MYCAIROCONTROL_ template<class T> class MyCairoControl : public IControl { private: T *pPlug; public: MyCairoControl(T *plug, IRECT container); ~MyCairoCont
#ifndef _MYCAIROCONTROL_
#define _MYCAIROCONTROL_
template<class T>
class MyCairoControl : public IControl
{
private:
T *pPlug;
public:
MyCairoControl(T *plug, IRECT container);
~MyCairoControl();
};
#endif // !_MYCAIROCONTROL_
但是它说“T”是未定义的,所以我不能使用这个向量。在类上使用模板不是正确的方法吗?您需要在实现文件中将
t
重新声明为模板类型名称:
#include "MyCairoControl.h"
template<class T>
MyCairoControl<T>::MyCairoControl(T *plug, IRECT container) : IControl(plug, container), pPlug(plug) {
// t->somethings();
}
template<class T>
MyCairoControl<T>::~MyCairoControl() {
}
任何人都可以使用
MyCairoControl
和MyCairoControl
,但尝试使用MyCairoControl
仍会给出未解决的外部符号错误,直到您为其添加转发声明。您需要在实现文件中重新声明T
作为模板类型名称:
#include "MyCairoControl.h"
template<class T>
MyCairoControl<T>::MyCairoControl(T *plug, IRECT container) : IControl(plug, container), pPlug(plug) {
// t->somethings();
}
template<class T>
MyCairoControl<T>::~MyCairoControl() {
}
任何人都可以使用
MyCairoControl
和MyCairoControl
,但尝试使用MyCairoControl
仍会给出未解决的外部符号错误,直到您为其添加转发声明。因为MyCairoControl
是类模板,其方法定义也必须是与类的模板参数匹配的模板:
template <class T>
MyCairoControl<T>::MyCairoControl(T *plug, IRECT container){
/* ... */
}
template <class T>
MyCairoControl<T>::~MyCairoControl() {
/* ... */
}
模板
MyCairoControl::MyCairoControl(T*插头,直接容器){
/* ... */
}
模板
MyCairoControl::~MyCairoControl(){
/* ... */
}
这也意味着定义必须在编译过程中始终可用,而不是链接-它们需要存在于头文件中
(“如何在.h文件中定义模板类并在.cpp文件中实现它”)对该问题进行了全面的解释。由于
MyCairoControl
是一个类模板,其方法定义也必须是与类的模板参数匹配的模板:
template <class T>
MyCairoControl<T>::MyCairoControl(T *plug, IRECT container){
/* ... */
}
template <class T>
MyCairoControl<T>::~MyCairoControl() {
/* ... */
}
模板
MyCairoControl::MyCairoControl(T*插头,直接容器){
/* ... */
}
模板
MyCairoControl::~MyCairoControl(){
/* ... */
}
这也意味着定义必须在编译过程中始终可用,而不是链接-它们需要存在于头文件中
(“如何在.h文件中定义模板类并在.cpp文件中实现它”)对这个问题给出了全面的解释。当然我已经尝试过了,但它说类模板“MyCairoControl”的参数列表缺少析构函数周围的参数列表。…抱歉-我遗漏了一些位-它是固定的。(特别是:参数是针对类的,并且必须在类名上,不仅仅是针对函数。我误解了这个问题。)当然我试过了,但它说类模板“MyCairoControl”的参数列表缺少析构函数周围的…抱歉-我遗漏了一些位-它是固定的。(特别是:参数是针对类的,并且必须在类名上,而不仅仅是针对函数。我误读了这个问题。)有消息告诉我,你迟早会读到这篇文章:@paizza我更新了我的答案,简要讨论了如何使用带模板的.cpp文件。它现在也可以工作了。有消息告诉我你迟早会读到:@paizza我更新了我的答案,简要讨论了如何使用带模板的.cpp文件。现在它也可以工作了。我认为OP更大的问题是将模板定义永无休止地放在一个单独的源文件中。@paizza:是的,这很烦人。。。尤其是当您有多个模板参数,并且方法也被模板化时!一种可能的替代方法是在类内部(就地)定义方法,这可以减少一些重复,但可能会使代码更难阅读(因为接口和实现之间没有分离)。如果您知道可能使用的类型,则不需要将实现放在头中。@vittoriormeo;我不明白你的意思。例如?@paizza:我提到的问题。这里是。我认为OP更大的问题是将模板定义永无休止地放在一个单独的源文件中。@paizza:是的,这很烦人。。。尤其是当您有多个模板参数,并且方法也被模板化时!一种可能的替代方法是在类内部(就地)定义方法,这可以减少一些重复,但可能会使代码更难阅读(因为接口和实现之间没有分离)。如果您知道可能使用的类型,则不需要将实现放在头中。@vittoriormeo;我不明白你的意思。例如?@paizza:我提到的问题。给你。