2011-09-20 12 views
8

Jestem zdezorientowany tym, jak szablon tworzenia instancji C++. Mam kawałek kodu:Utworzenie szablonów w C++

template <class T, int arraySize> 
void test1(T (&array)[arraySize]) 
{ 
    cout << typeid(T).name() << endl; 
} 

template<class T> 
void test2(T &array) 
{ 
    cout << typeid(T).name() << endl; 
} 

int main() 
{ 
    int abc[5]; 
    test1(abc); 
    test2(abc); 
    return 0; 
} 

Oto moje pytania:
1. W jaki sposób wielkość tablicy ABC jest przekazywany do test1 (z arraySize parametrów)?
2. W jaki sposób kompilator C++ określa typ T w dwóch szablonach?

+1

Masz na myśli coś takiego jak 'test1 (abc)'? Drugi nie ma sensu. Masz funkcję 'test2 ' i indeksujesz ją tak, jakby była tablicą ?! – Shahbaz

Odpowiedz

4

W teście 1 kompilator tworzy szablon z T [arraySize] będącym jego formą. Kiedy wywołujesz test1 (abc), podajesz argument wejściowy typu int [5], który szablon dopasowujący automatycznie dopasowuje.

Jeśli jednak miał napisać

int n=10; 
int *abc = new int[n]; 
test1(abc); 
test1<int,n>(abc); 

następnie kompilacja zawiedzie i kompilator twierdzą, że nie ma szablonu dopasowując test1 (ABC) wywołanie funkcji lub test1 < int n> (abc) wywołanie funkcji.

Dzieje się tak, ponieważ rozmiar abc jest teraz przydzielany dynamicznie, a zatem typ abc jest wskaźnikiem, który ma inny typ, a zatem żaden szablon nie może być dopasowany do powyższych dwóch połączeń.

Poniższy kod pokazuje niektóre rodzaje

#include <iostream> 
using namespace std; 

template <class T> void printName() {cout<<typeid(T).name()<<endl;} 

int main() 
{  
    printName<int[2]>(); //type = A2_i 
    printName<int*>();  //type = Pi 

    getchar(); 
    return 0; 
} 
+1

poza tym, że 'abc [n]' i tak się nie skompiluje, ponieważ C++ nie obsługuje dynamicznie sortowanych tablic (nawet C++ 11, o ile wiem). Zgaduję, że masz tło C99? –

+0

Jest skompilowany dobrze pod kompilatorem 3.0 llvm jabłek. Zaktualizowałem odpowiedź. Dziękuję za wskazanie tego. – twerdster

7
  1. Nie ma parametr przechodzącą w normalnym znaczeniu, ponieważ parametry szablonu są rozwiązywane w czasie kompilacji.
  2. Zarówno arraySize, jak i T są wywnioskowane z typu parametru array. Ponieważ w trakcie kompilacji przechodzi się kolejno pod numer int[5], arraySize i , stają się one odpowiednio następujące:i 5 i int.

Jeśli, na przykład, ogłosił int* abc = new int[5];, kompilator będzie barf w punkcie spróbować zadzwonić test1(abc). Oprócz podstawowej niedopasowania typu, int* nie zawiera wystarczającej informacji, aby wywnioskować rozmiar tablicy.

Powiązane problemy