导航:首页 > 源码编译 > 模板编译检测

模板编译检测

发布时间:2022-10-20 21:00:26

① C++编写Screen类模板 编译出错syntax error : missing ';' before '<'

构造函数定义
Screen<hi,wid>::Screen<hi,wid>(const string& cont):cursor(0),height(hi),width(wid){...}

改为
Screen<hi,wid>::Screen(const string& cont):cursor(0),height(hi),width(wid){...}
试试

② C++ 模板 编译错误 vc++6.0 但是在vs2010上可以运行。。。但我不习惯2010

因为你的这个调用 std::cout<<*max(&ia,&ib)<<"\n"; 会引起二义性
即两个max函数都可以调用,没有那个优先高,
*max(&ia,&ib) 调用二义性分析:
对于T const& max(T const& a, T const& b)函数:令T 为 int*,即可调用
对于T* const& max(T* const& a, T* const& b)函数,令T为 int ,即可调用

也就是说,其实第一个函数已经包括了第二个,所以在定义重载函数时一定要小心,模板参数T即可以为T,也可以代表T*,T*就是一种类型

你也可以指出显示模板参数类消除调用二义性:
std::cout<<*max<int>(&ia,&ib)<<"\n";
std::cout<<max<char>(s1,s2)<<"\n";
我调试过了,没有错误了。

③ C++函数模板编译老出错的问题

if(max<x[i])
max=x[i];
这两句是x[i] 不是 a[i]

④ c++模板定义及编译

template<classDtaeType>
classseqList
{
staticconstintdefaultSize=10;//顺序表默认存储大小
DtaeType*pElements;//顺序表地址
intmaxSize;//顺序表最大存储容量
intlength;//顺序表中有效元素个数
public:
seqList(intsize=defaultSize)
:maxSize(size),length(0)
{
pElements=newDtaeType[maxSize];
}
~seqList()
{
delete[]pElements;
}
};

intmain()
{
seqList<int>seqlist;

return0;
}

⑤ C++模板:这个程序为什么通不过编译(C++11)

1):我们将testTemplate.cpp文件从工程中拿掉,即删除testTemplate.cpp的定义。然后直接编译上面的文件,能编译通过。这说明编译器在展开testTemplate.h后编译main.cpp文件的时候并没有去检查模板类的实现。它只是记住了有这样的一个模板声明。由于没有调用模板的成员函数,编译器链接阶段也不会在别的obj文件中去查找类模板的实现代码。因此上面的代码没有问题。
2):把main.cpp文件中,第7行的注释符号去掉。即加入类模板的实例化代码。在编译工程,会发现也能够编译通过。回想一下这个过程,testTemplate.h被展开,也就是说main.cpp在编译是就能找到MyClass<T>的声明。那么,在编译第7行的时候就能正常的实例化一个类模板出来。这里注意:类模板的成员函数只有在调用的时候才会被实例化。因此,由于没有对类模板成员函数的调用,编译器也就不会去查找类模板的实现代码。所以,上面的函数能编译通过。
3):把上面第10行的代码注释符号去掉。即加入对类模板成员函数的调用。这个时候再编译,会提示一个链接错误。找不到printValue的实现。道理和上面只有函数的声明,没有函数的实现是一样的。即,编译器在编译main.cpp第10行的时候发现了对myClass.PrintValue的调用,这时它在当前文件内部找不到具体的实现,因此会做一个标记,等待链接器在其他的obj文件中去查找函数实现。同样,连接器也找不到一个包括MyClass<T>::PrintValue声明的obj文件。因此报告链接错误。
4):既然是由于找不到testTemplate.cpp文件,那么我们就将testTemplate.cpp文件包含在工程中。再次编译,在VS中会提示一个链接错误,说找不到外部类型_thiscall MyClass<int>::PrintValue(int)。也许你会觉得很奇怪,我们已经将testTemplate.cpp文件包含在了工程中了阿。先考虑一个问题,我们说过模板的编译实际上是一个实例化的过程,它并不编译产生二进制代码。另外,模板成员函数也只有在被调用的时候才会初始化。在testTemplate.cpp文件中,由于包含了testTemplate.h头文件,因此这是一个独立的可以编译的类模板。但是,编译器在编译这个testTemplate.cpp文件的时候由于没有任何成员函数被调用,因此并没有实例化PrintValue成员。也许你会说我们在main.cpp中调用了PrintValue函数。但是要知道testTemplate.cpp和main.cpp是两个独立的编译单元,他们相互间并不知道对方的行为。因此,testTemplate.cpp在编译的时候实际上还是只编译了testTemplate.h中的内容,即再次声明了模板,并没有实例化PrintValue成员。所以,当main.cpp发现需要PrintValue成员,并在testTemplate.obj中去查找的时候就会找不到目标函数。从而发出一个链接错误。
5):由此可见,模板代码不能按照常规的C/C++代码来组织。必须得保证使用模板的函数在编译的时候就能找到模板代码,从而实例化模板。在网上有很多关于这方面的文章。主要将模板编译分为包含编译和分离编译。其实,不管是包含编译还是分离编译,都是为了一个目标:使得实例化模板的时候就能找到相应的模板实现代码。大家可以参照这篇文章。
最后,作一个小总结。C++应用程序的编译一般要经历展开头文件->编译cpp文件->链接三个阶段。在编译的时候如果需要外部类型,编译器会做一个标记,留待连接器来处理。连接器如果找不到需要的外部类型就会发生链接错误。对于模板,单独的模板代码是不能被正确编译的,需要一个实例化器产生一个模板实例后才能编译。因此,不能寄希望于连接器来链接模板的成员函数,必须保证在实例化模板的地方模板代码是可见的。

⑥ 急急急。php问题,提示 Smarty的模板语法编译错误,怎么解决

根据你贴出的报错信息,可以判断出你模版里面用的分隔符(delimiter)不对,你看看你初始化smarty的时候left_delimiter 和right_delimiter 写的什么,比如我的配置如下:

	'left_delimiter'=>'{%',
'right_delimiter'=>'%}',

那么在模版里就写:{%if $regularlist['total'] > 0%} aaa{%/if%}

⑦ 模板类无法编译通过,谁能帮我解释

返回值前面加个 typename就可以,
这是为了告诉编译器class_A<T>::struct_A是一种类型而不是类的成员变量

其实:
warning C4346: “class_A<T>::struct_A” : 依赖名称不是类型
用“typename”为前缀来表示类型
编译器说的非常明确了!

VS7.1上编译通过!VS6.0不知道可不可以!

template <class T>
typename class_A<T>::struct_A* //---这里加个typename
class_A<T>::generate_new_struct_A_instance()
{
struct_A * new_instance = new struct_A;
new_instance->a = 1;
new_instance->b = 2;
return new_instance;
}

///
改成double 为什么可以,我很长时间没看模板了,具体我也不清楚!
我估计对于特化的函数是把它当作一般函数那样编译的!

⑧ codeblocks 测试函数模板通不过编译:call of overloaded 'swap(int&, int&)' is ambiguous

测了一下,语法没有大错误。codeblocks的后端gcc/mingw也支持模板。
不能编译运行的原因是swap函数与标准库的std::swap函数冲突。属于调用疏忽。
解决方法1:调用时声明名字空间,把swap(a1,a2);改成::swap(a1,a2);前加::,避免冲突
解决方法2:改变函数名称,把自定义的函数swap改成swapABC或其它。

⑨ C++模板友元的编译错误

1、第三行 friend Stack<T>; 缺少类型修饰符,应修改为friend class Stack<T>;
2、第三行加上class之后,还会出现问题,编译器不能识别标识符Stack<T>,这是因为Stack是模板类型,需要在Node模板定义前加上Stack模板声明,也就是在第一行前面加上
template<class T> class Stack;

修正如下:
template<class Type> class Stack; // 1、加上Stack模板声明
template<class T>
class Node
{ friend class Stack<T>; // 2、加上类型修饰符class
private:
T data;
Node<T> *link;
public:
Node(T item,Node<T>*p=NULL)
{
data=item;
link=p;
}
};

template<class T>
class Stack
{
public:
Stack(){top=0;}
~Stack();
Stack<T>&Push(T item);
Stack<T>&Pop();
void Print();
private:
Node<T> *top;
};

⑩ 请教C++模板函数在编译时处理

模板函数类型检查是放在调用的时候检查的.因为在定义的时候是没有办法区分的(比如你这个例子,就存在int转换float和float转换int的警告级别差异.)

所以严格的说来,编译器是发现调用了test(v1,u1),才开始检查的.由于底层实现将形参类型用实际V1和u1的类型做了替换,然后就可以实际判断隐式转换的合理性.

阅读全文

与模板编译检测相关的资料

热点内容
自己购买云主服务器推荐 浏览:422
个人所得税java 浏览:761
多余的服务器滑道还有什么用 浏览:192
pdf劈开合并 浏览:28
不能修改的pdf 浏览:752
同城公众源码 浏览:489
一个服务器2个端口怎么映射 浏览:298
java字符串ascii码 浏览:79
台湾云服务器怎么租服务器 浏览:475
旅游手机网站源码 浏览:332
android关联表 浏览:946
安卓导航无声音怎么维修 浏览:333
app怎么装视频 浏览:431
安卓系统下的软件怎么移到桌面 浏览:96
windows拷贝到linux 浏览:772
mdr软件解压和别人不一样 浏览:904
单片机串行通信有什么好处 浏览:340
游戏开发程序员书籍 浏览:860
pdf中图片修改 浏览:288
汇编编译后 浏览:491