不是类模板的专有化
① 我申请了是一种建筑模板专利可以把在同一种地方使用的各种类型的模板纳入专利
1、您把其他使用的各种类型的模板一起纳入专利的话,基本不会授权,不符合专利法的规定。
2、《专利法》第二十五条规定对于智力活动的规则和方法不授予专利权。
② c++ 类模板 内部类
class LinkList; //提前声明,因为定义友元要用到
template <class ElemType>
class LNode {
protected:
ElemType data; //数据域
LNode *next; //指针域
public:
friend class LinkList;
//不定义任何函数,相当内于struct LNode
};
class LinkList {
protected:
//ln *head; //头指容针 //你这里ln是什么?LNode?
LNode<int> *head;//模板类必须包括模板参数<ElemType>,我这里假设是int
public:
LinkList();
~LinkList();
Status GetElem(int i, LNode<int> &e){e.data;};//要访问ElemType,就用e.data
};
③ C++ 类模板的静态私有内部类如何初始化
template <typename T> Singleton<T>::Worker Singleton<T>::worker;你这句话是多余的。应该是在模板实例化的时候生成的Class里就含有一个内Worker的实例了(因为容你是静态的),这样再用这个类生成实例的时候也就自然会在各个实例中共享这个worker instance。
④ 能否在非模版类里面定义 模版类指针,能的话如下:
要么将B也定义为模版类,如下:
template <int id, typename T>class A{};
template <int id, typename T>
class B{
public:
A<id, T> *a;
};
要么就是具体化的模版类A,如下:
template <int id, typename T>class A{};
class B{
public:
A<0, int> *a;};
⑤ 关于类模板特化的问题
“特化过程中试过定义构造函数”
什么叫做“特化过程”?特化就那么一瞬间的事,传参数给它就马上特化了,你怎么能在这个过程“定义构造函数”?
如果可以的话,你可以把代码贴出,根据你的表述根本不知道你现在的是什么情况。
⑥ C++类模板的问题
你的代码有如下问题:
pair与std标准库的pair命名冲突,一般来说尽量不要使用using namespace std;使用std::cout这种格式是一种良好的编程
定义函数template <class T>T pair::getmax ()格式不对,应该为template <class T>T pair<T>::getmax ()
pair myobject(100,75);使用模板类应该传入类型,即pair<int> myobject(100,75);
修改后代码如下:
#include<iostream>
template<classT>
classpair
{
private:
Tvalue1,value2;
public:
pair(Tfirst,Tsecond)
{
value1=first;
value2=second;
}
Tgetmax();
};
template<classT>
Tpair<T>::getmax()
{
Tretval;
retval=value1>value2?value1:value2;
returnretval;
};
intmain()
{
pair<int>myobject(100,75);
std::cout<<myobject.getmax()<<std::endl;
return0;
}
编译运行结果如下:
⑦ c++中如何在一个类模板中,声明要使用另一个类模板作为参数
可以对A的声明修改为
template <class T1, class T2>
class A
{
};
然后T2就对应于你需要的类型B,在成员函数中使用就好了。
⑧ C++ VS2010编译器报错:未专用化的类模板不能用模板变量
呃, 好多错误...
const ID_ id 中的 const 会被编译器忽略掉, 可以不写(这个不算错误).
这是一个最基本的Error: 类定义 后面 要有 ; 结尾.
ID_ 既然是 int 的 alias, 那 类C 就是一个 非类型实参的类模板. 也就是说, C<> 的 <> 中应该是个 int的数字, 不能是 int 或者 ID_, 或者 其它类型.
对于 C++98 C++03 而言, vector<C<5> > 中最后面的 两个 大于号之间 必须要有至少一个空格. 这是语法规定. 除非你的编译器支持 C++11, 而且你在编译的时候 指定了编译选项
-std=c++14
或者
-std=c++11
最后, 一个修改后的版本:
#include<vector>
typedefintID_;
template<ID_id>
classC
{
public:
voidsay(){};
};
//typedefstd::vector<C>CVec;//报错
//typedefstd::vector<C<ID_>>CVec;//报错
//typedefstd::vector<C<int>>CVec;//报错
typedefstd::vector<C<1>>CVec;//注意:这三个是不同的类型
typedefstd::vector<C<2>>CVec;//注意:这三个是不同的类型
typedefstd::vector<C<999>>CVec;//注意:这三个是不同的类型
intmain()
{
CVecvec;
return0;
}
最最后, 欢迎交流. :)
⑨ 类模板我注意到两种有定义方法:1.template <class T>;2.template <typename T>是不是都可以有什么区别
原来复把你的意思制理解错了,囧....
下面引用Bjarne.Stroustrup自己的话:
The 'typename' keyword can also be used as an alternative to 'class' in template declarations. For
example:
template <typename T > void f (T );
Being an indifferent typist and always short of screen space, I prefer the shorter:
template <class T > void f (T );
⑩ C++类模板实例化的问题
其实无非两种,一种是具体化(又叫偏特化)一种是实例化(又叫全特话),对于具体化,就是
对模板的范围进一步压缩,并给这个更小的范围从新定义类成员(包括数据成员和方法)。对于实例化就是直接生成模板中某种实例(注意:同时给一个模板生成同一个实例化和具体化将报错)。举例:
#include<iostream>
#include<cstdio>
#include<stdlib.h>
using namespace std;
template <typename T1,typename T2>//#1
class A
{
int a;
public:
A (){cout<<"this is A<T1,T2> default constructor function!\n";}
};
template <typename T1>
class A<T1,int>//部分的具体化 #2
{
int b;
public:
A (){cout<<"this is A<T1,int> default constructor function!\n";}
};
template class A<int,char>;//显示的实例化,将直接生成该类型类定义
int main()
{
class A<int ,int> a;//隐式实例化 ,将隐式生成#2 的实例
class A<int ,char> b; //隐式实例化,将隐式生成#1的实例
return 0;
}