導航:首頁 > 源碼編譯 > 模板編譯檢測

模板編譯檢測

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

閱讀全文

與模板編譯檢測相關的資料

熱點內容
自己購買雲主伺服器推薦 瀏覽:419
個人所得稅java 瀏覽:761
多餘的伺服器滑道還有什麼用 瀏覽:189
pdf劈開合並 瀏覽:27
不能修改的pdf 瀏覽:751
同城公眾源碼 瀏覽:488
一個伺服器2個埠怎麼映射 瀏覽:297
java字元串ascii碼 瀏覽:78
台灣雲伺服器怎麼租伺服器 瀏覽:475
旅遊手機網站源碼 瀏覽:332
android關聯表 瀏覽:945
安卓導航無聲音怎麼維修 瀏覽:332
app怎麼裝視頻 瀏覽:430
安卓系統下的軟體怎麼移到桌面 瀏覽:96
windows拷貝到linux 瀏覽:772
mdr軟體解壓和別人不一樣 瀏覽:904
單片機串列通信有什麼好處 瀏覽:340
游戲開發程序員書籍 瀏覽:860
pdf中圖片修改 瀏覽:288
匯編編譯後 瀏覽:491