① 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的類型做了替換,然後就可以實際判斷隱式轉換的合理性.