首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我们需要为每个类函数定义指定类型模板参数?

为什么我们需要为每个类函数定义指定类型模板参数?
EN

Stack Overflow用户
提问于 2015-12-14 06:04:26
回答 2查看 170关注 0票数 2

既然我们在类声明上定义了模板类型,为什么我们必须在每个函数定义之后指定它呢?我很困惑,因为它甚至在同一个文件中,所以似乎几乎没有必要在每个函数上指定它,而且因为我们正在使用::运算符,所以它不应该返回到类声明,并看到T已经定义好了。

我是c++的新手,仍然需要澄清一些误解。

代码语言:javascript
复制
#ifndef __Foo_H__
#define __Foo_H__

template <class T>
class Foobar{

  private:
    bool foo1(T);
    bool foo2(T);

  public:
   FooBar();

};

template <class T> bool FooBar<T>::foo1(T data){
 code..
}

template <class T> bool FooBar<T>::foo2(T data){
 code..
}

#endif
EN

Stack Overflow用户

发布于 2015-12-14 07:15:33

模板是泛型编程的一个例子。其思想是重用代码/算法。在具有严格类型控制的语言中,您会遇到看似不必要的约束。例如,你可能有一些排序功能,在一个项目中做得很好,但与另一个项目中使用的类型不兼容。

C#和Java引入了泛型编程作为模板( C++ )和泛型(C#,Java)。在泛型(让我们来讨论Java)中,类是现有的实体,而类参数主要用作类型控制服务。这就是他们在集合中的目的。当您检查list的工作方式时,您会看到list收集对象,并仅在检索到对象时才转换回参数化类型。在编写类时,您只能假设参数化类型为Object或声明的接口,如下例所示:

class Test<T extends Comparable> {}

在这里,您可以使用T作为可比较的。除非显式声明接口,否则该参数将被视为对象。

现在来看看泛型和模板之间的区别。在C++中,您可以对实现中的参数化类型做更多的假设。您可以编写未知类型对象的排序。在Java中,你至少必须知道什么是参数类型的接口。这导致C++必须为每个参数构建新的类(以便检查代码是否正确)。Vector<int> **与**Vector<float>是完全独立的类型。而在Java中,只有一个类Vector<? extends Comparable>

::是作用域运算符。您可以访问Vector<int>的作用域,因为该类存在,但是Vector不存在。

因此,Java可以编译泛型,而C++不能。所有模板都必须在头文件中对所有程序员可用;你不能隐藏它(有一些工作需要编译模板,但我不知道它的状态是什么)。

因此,当使用泛型时,您可以引用方法Vector.add(),而当使用模板时,您必须指定参数template<class T> Vector<T>

PS。由于模板参数是类名不可或缺部分,因此可以使用模板进行编译时计算,如fibonaci序列

代码语言:javascript
复制
template<int N> struct Fibonaci {
  static const int element = Fibonacci<N-1>::data + Fibonacci<N-2::data>;
}
template<1> struct Fibonaci {
  static const int element = 1;
}
template<0> struct Fibonaci {
  static const int element = 0;
}
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34256942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档