① 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的类型做了替换,然后就可以实际判断隐式转换的合理性.