Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';使用模板有什么问题?_C++_Templates - Fatal编程技术网

C++ 什么';使用模板有什么问题?

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

这是我第一次在类中使用模板。这是我的计划

MyCairoControl.h:

#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:我提到的问题。给你。