Ben templated class
(o Foo
call) birkaç uzmanlık sahip olduğu. Birisi, Foo
'un özel olmayan bir sürümünü kullanmaya çalıştığında derlemenin başarısız olmasını isterim. İşte Uzman olmayan şablon örneği nasıl önlenir?
template <typename Type>
class Foo
{
Foo() { cannot_instantiate_an_unspecialized_Foo(); }
// This method is NEVER defined to prevent linking.
// Its name was chosen to provide a clear explanation why the compilation failed.
void cannot_instantiate_an_unspecialized_Foo();
};
template <>
class Foo<int>
{ };
template <>
class Foo<double>
{ };
o:
int main()
{
Foo<int> foo;
}
İşleri ederken:
int main()
{
Foo<char> foo;
}
yok mu. bağlama işlemi gerçekleştiğinde
Açıkçası, derleyici zinciri sadece şikayet ediyor. Ama daha önce şikayet etmenin bir yolu var mı?
Ben boost
kullanabilirsiniz.
template <typename Type>
class Foo;
template <>
class Foo<int> { };
int main(int argc, char *argv[])
{
Foo<int> f; // Fine, Foo<int> exists
Foo<char> fc; // Error, incomplete type
return 0;
}
Neden bu işi yapar:
Çok teşekkür ederim. Sanırım çok karmaşık bir şey arıyordum. – ereOn
@Schnommus Ama sınıfını tanımlamak ve bu bir static_assert varsa uzmanlık daha iyi eşleştiği için, bu örneği asla olmamalı? –
Bu kötü bir karardır, çünkü derleme aşamasında değil, bağlantı aşamasında hata verilecektir. Ve uzmanlık alanı olmayan bir sınıfı nerede kullandığınızı asla bilemezsiniz. – vladon