2011-08-04 21 views
5

Uzmanlaşmanın açıkça yazılmadığı türler için şablonla yazılmış işlevi kullanmak bir şekilde yasaklanabilir mi? Ben uzmanlaşmak çalıştığınızda bu foo bir şablon işlevi değil, ben derleyici diyor sonra neden fonksiyonun jenerik versiyonu atlamak olamayacağınıözel olmayan şablonu engelle C++

template <typename T> 
void foo(){} 

template <> 
void foo<int>(){} 

int main(int argc, char* argv[]){ 
    foo<int>(); //ok 
    foo<char>(); //Wrong - no specialized version for char. 
} 

gibi bir şey yani. Genel işlevde derleme yapamayan bir şey yazabilirim ve nedenini açıklayan bir açıklama ekleyebilirim, ancak bu oldukça bilgilendirici olamaz. Yapmak istediğim şey, derleyicinin doğrudan "foo() tanımlanmamış" gibi bir hataya yol açabilmesidir.

cevap

13

Emin: sadece tanımlamaz ve bunu kullanmaya çalışırsanız bir bağlayıcı hatası alırsınız:

template <typename T> 
void foo(); // not defined 

template <> 
void foo<int>() { } 

Alternatif olarak, bir "güzel vermek için statik bir assert bazı varyasyon kullanabilirsiniz msgstr "derleme zamanı hatası. İşte C++ 0x static_assert kullanarak bir örnek. Şablon parametresine bağlı olarak false değerini yapmanız gerektiğini unutmayın, aksi halde şablon ayrıştırıldığında static_assert tetiklenebilir. o not to specialize function templates genellikle en iyisi olduğunu

template <typename T> 
struct dependent_false { enum { value = false }; }; 

template <typename T> 
void foo() 
{ 
    static_assert(dependent_false<T>::value, "Oops, you used the primary template"); 
} 

Not. Bunun yerine, özel bir sınıf şablonuna delege etmek daha iyidir:

template <typename T> 
struct foo_impl 
{ 
    static_assert(dependent_false<T>::value, "Oops, you used the primary template"); 
}; 

template<> 
struct foo_impl<int> 
{ 
    static void foo() { } 
}; 

template <typename T> 
void foo() 
{ 
    return foo_impl<T>::foo(); 
} 
4

Elbette, varsayılan genel şablon için tanım tanımlamayın.

İlgili konular