我對使用帶有 例如,我們假設我有2個函式和一個具有相同原型的 而在編譯主函式之后: 輸出結果是這樣的: 為了記錄,所有的代碼都寫在同一個CPP檔案中。
uj5u.com熱心網友回復: 你必須記住,字面字串實際上是(常量)字符陣列,它衰減為(常量)指向 由于你的函式接受 uj5u.com熱心網友回復: 在這些呼叫中 你明確指定了模板引數。所以編譯器將只考慮模板函式。 在這個呼叫中 你沒有指定模板引數。所以編譯器將考慮所有名字為 代表字串字面的引數的型別是 由于標準的轉換序列,引數被明確地轉換為指向型別為 因此編譯器可以推斷出模板引數的型別為 要呼叫非模板函式
編譯器需要再使用一個轉換(用戶定義的轉換)來將指標轉換為 因此,由于模板函式需要較少的轉換,那么它被編譯器認為是更合適的。因此,你會得到這樣的輸出
下面是一個示范程式。 程式輸出是
標籤: 下一篇:如何將WCF服務發布到IIS?
<>括號的template和沒有括號的的想法有點困惑。當我編譯代碼時,我得到了我所不期望的輸出,并且沒有弄清楚為什么。
模板:using namespace std;
template<typename T> void copy(T a, T b)
{
cout << "模板復制" << endl;
}
void copy(int a, int b)
{
cout << "int copy" << endl;
}
void copy( string a, string b)
{
cout << "字串復制" << endl;
int main()
{
copy<int>(1, 2)。
copy<string>("ha"/span>, "ha"/span>)。
copy("ab"/span>, "bc"/span>)。
copy(1, 2)。
return 0;
template copy
template copy
template copy
int copy
char的指標,即const char*。std::string引數不是直接匹配的,并且編譯器不會進行轉換,模板多載將被使用(如copy<const char*>)。
copy<int>(1, 2)。
copy<string>("ha", "ha") 。
copy("ab"/span>, "bc"/span>) 。
copy的多載函式,并選擇最可行的函式。const char [3]。const char *的字串字面的第一個字符的指標。
const char *。void copy(字串a,字串b)
{
cout << "字串復制" << endl;
std::string型別的物件。template copy
#include <iostream>
#include <ioomanip>
#include <type_traits>
template <typename T>
void f( T , T )
{
std::cout << std::boolalpha << std::is_same<T, const char *>:value<< '
'。
}
int main()
{
f( "ab", "bc" ) 。
return 0。
true
