C++ 模板<;类键、类类型>;C+中方法前的平均值+;?

C++ 模板<;类键、类类型>;C+中方法前的平均值+;?,c++,C++,我已经得到了这段代码,我正在努力理解遵循的约定,.cpp文件中定义的所有方法都是在它们之前编写的模板。这是什么意思 例如: //Constructor template<class key, class type> MyOperation<key, type>::MyOperation() { //method implementation } //A method template<class key, class type> MyOperation&

我已经得到了这段代码,我正在努力理解遵循的约定,.cpp文件中定义的所有方法都是在它们之前编写的
模板
。这是什么意思

例如:

//Constructor
template<class key, class type>
MyOperation<key, type>::MyOperation()
{
  //method implementation
}

//A method
template<class key, class type>
MyOperation<key, type>::otherOperation()
{
  //method implementation
}
//构造函数
模板
MyOperation::MyOperation()
{
//方法实现
}
//方法
模板
MyOperation::otherOperation()
{
//方法实现
}

谢谢

这个类是一个模板类——它可以通过类型参数化。要创建该类的实例,您可以编写

MyOperation<int, int> myop;
MyOperation-myop;

关于C++模板有一篇不错的文章。模板是C++的重要组成部分,但要花很长时间才能精通。C++标准库的很大一部分使用模板(这通常是由它的非官方名称,STL)知道的。例如,
vector
是类型为T的模板。

它只是意味着在头文件中模板类被定义为:

template<class key, class type>
class MyOperation
{
   ...
};
例如:

template<class key, class type> MyOperation<key, type>::otherOperation() { ... }
模板MyOperation::otherOperation(){…}

它告诉C++编译器,声明之后的内容是模板化的。 更具体地说,这意味着在接下来的任何情况下,单词KeyType和DataType都是某些类型的占位符名称,在调用该方法时,这些占位符名称将是明显的或指定的。此时,编译器将获取模板,根据您使用的内容替换方法中的KeyType和DataType,并编译该副本


在代码示例中,显示模板的部分是类,所以方法可能实际上不使用它们——但是C++在使用时需要能够将方法的通用实现绑定到类。

< P>已经有一个很好的答案已经存在,但是我也将把我的也投入到池中。 C++允许单独完成程序结构的声明和实现。它源于C/C++程序员如何相互发布新功能:头文件包含在依赖的编译单元中,而不是那些依赖于编译中存在的元数据的单元中(就像使用C#或Java时所期望的那样)

每次给编译器一条指令,无论是声明(“这个接口会有这个东西”)还是实现(“这个接口和这些行为会有这个东西”),您都有机会将该指令模板化

事实上,您可以选择这样做,而不是要求这样做,这比Java和C等更现代的语言提供的灵活性要大得多

考虑以下模板(我已经生锈了,请注意一些小的语法问题):

模板
I类垃圾{
私人:
垃圾我的垃圾;
公众:
无效设置垃圾(垃圾常量和来源);
垃圾常量&GetJunk()常量;
}
所述模板的“典型”实现可能包括以下默认行为:

template<typename Junk>
void IGotJunk<Junk>::SetJunk(Junk const& source)
{
  myJunk_ = source;
}
模板
void IGotJunk::SetJunk(垃圾常量和源)
{
我的垃圾=来源;
}
但是,对于字符串,在复制指针之后,字符串有被修改的风险,在这种情况下,您可以提供一种专门的行为来确保复制字符串本身,而不是指针(同样,这是一个很长很长的时间)

void IGotJunk::SetJunk(char*const&source)
{
免费(我的垃圾);
我的垃圾=malloc(strlen(来源)+1);
strcpy(我的垃圾,来源);
}

然后可以对GetJunk()执行类似的操作。这可能就是为什么您必须为您创建的每个工件声明模板参数的原因:因为您可能不希望它们在每种情况下都相同。

其他人给出了很好的答案-我只想指出,在标准库标题的某个地方,您会找到类似的内容,例如std::map::insert-std::map,std::set和std::vector以及其他标准容器都是模板类。
template<typename Junk>
class IGotJunk {
private:
  Junk myJunk_;
public:
  void SetJunk(Junk const& source);
  Junk const& GetJunk() const;
}
template<typename Junk>
void IGotJunk<Junk>::SetJunk(Junk const& source)
{
  myJunk_ = source;
}
void IGotJunk<char*>::SetJunk(char* const& source)
{
  free(myJunk_);
  myJunk_ = malloc(strlen(source) + 1);
  strcpy(myJunk_, source);
}