2016-03-31 19 views
0

Böyle kuralların var ama derleyici hata hakkında diyor (hata C2913: açık ihtisas; 'Vektör' bir sınıf şablonu d olan bir uzmanlık değildir: \ test_folder \ ConsoleApplication1 \ ConsoleApplication1 \ consoleapplication1.cpp 28 1 ConsoleApplication1 ):Parametre olmadan şablon sınıfının nasıl uzmanlaştırılır?

#include <iostream> 

template <int N, int ... T> 
class Vector 
{ 
public: 
    static void print_arguments(void) 
    { 
     std::cout << N << " : " << std::endl; 
     Vector<T>::print_argumetns(); 
    } 
protected: 
private: 
}; 

template <> 
class Vector<> 
{ 
public: 
    static void print_arguments(void) 
    { 
    } 
protected: 
private: 
}; 

int main(void) 
{ 
    std::cout << "Hello world" << std::endl; 
    int i = 0; 
    std::cin >> i; 
    return 0; 
} 
+0

parametresiz bir uzmanlık değil, bir "genelleştirme" olarak adlandırmak isterim ki bu mümkün değil afaik – user463035818

+0

Başka bir deyişle, hiçbir parametre olmadan şablon oluşturamıyorum? – LmTinyToon

+1

Anlamadım, neden bunu yapmak istiyorsun? Bunun nasıl kullanılması gerekiyor? – user463035818

cevap

6

Vector, şablon parametreleri olmadan Vector bir uzmanlık oluşturamazsınız, çünkü Vector en az bir gerektirir.

template <int N, int ... T> 
class Vector 
{ 
public: 
    static void print_arguments(void) 
    { 
     std::cout << N << " : " << std::endl; 
     Vector<T...>::print_arguments(); 
    } 
protected: 
private: 
}; 

template <int N> 
class Vector<N> 
{ 
public: 
    static void print_arguments(void) 
    { 
     std::cout << N << " : " << std::endl; 
    } 
protected: 
private: 
}; 

:

//primary template 
template <int... Ns> 
class Vector; 

//this is now a specialization 
template <int N, int ... T> 
class Vector<N,T...> 
{ 
    //... 
}; 

template <> 
class Vector<> 
{ 
    //... 
}; 
+0

Harika! teşekkürler, ama anlayamıyorum, neden bu kod sürümü çalışır. Bana açıklamalara link verebilir misiniz, lütfen? – LmTinyToon

+0

Özellikle neyi anlamıyorsunuz? – TartanLlama

+0

Neden birincil şablon bildirimi gerekiyor? – LmTinyToon

0

Ne muhtemelen istediğiniz şudur:

Bunun yerine ne olabilir uzmanlık olarak her iki vaka daha sonra, şablon istenen sayıda argümanı almak tanımlamak için birincil şablon beyan olduğunu İkincisi, sadece bir parametre kullanıldığında kullanılan "sonlandırma" kısmi uzmanlıktır.

+0

anladım Bu sürüm böyle bir durumda çalışmayacak, sanırım: Vector <> vector; – LmTinyToon

+0

Evet, TartanLlama sürümü, bu durumda bile çalıştığı kadar iyidir, genel fikir aynıdır. – axalis

İlgili konular