既然我们在类声明上定义了模板类型,为什么我们必须在每个函数定义之后指定它呢?我很困惑,因为它甚至在同一个文件中,所以似乎几乎没有必要在每个函数上指定它,而且因为我们正在使用::运算符,所以它不应该返回到类声明,并看到T已经定义好了。
我是c++的新手,仍然需要澄清一些误解。
#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发布于 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序列
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;
}https://stackoverflow.com/questions/34256942
复制相似问题