2012-05-14 89 views
2

爲什麼按照C++的作品,我想ODR規則將進入圖片爲下面的代碼C++模板和ODR規則

typedef char  int8; 
class Sample { 
public: 
    template <typename T> 
    void test(T param){ 
    } 
}; 

int main() { 
    Sample s; 
    s.test<char>('a'); 
    s.test<int8>((int8)'b'); 
    return 0; 
} 
+0

有什麼不對?你認爲什麼是正確的行爲? – Vlad

+1

爲什麼?這裏只有一個'void test(char param)的實例,' – jrok

+0

@jrok:但編譯器不會生成兩個版本的測試函數 – Avinash

回答

2

因爲當模板實例完成和編譯器擺脫typedef和不必要的鑄件,你的代碼是完全一樣:

class Sample { 
public: 
    void test(char param){ 
    } 
}; 

int main() { 
    Sample s; 
    s.test('a'); 
    s.test('b'); 
    return 0; 
} 

你似乎認爲一個typedef聲明彼此不同的類型,但是這不是這樣。這只是一個別名(通常你的方便)。 OTOH,當您使用不同的模板參數調用函數模板時,會生成具有不同簽名的函數。在任何情況下都不會違反ODR。

1

,這既是時代做同樣的事情。看起來他們不一樣。

第一個說它會使用char版本,所以T變成char

第二個說它會使用int8版本,所以T會變成int8,這實際上只是一個變相的char。因此,T仍然是一個字符,並且在兩種情況下都會傳入一個字符,所以一切都很好。