2016-03-09 12 views
7

Neden bu geçerli C++ değil?Neden hem şablon kapsayıcısında hem de şablonda bulunan bir değeri bildiremiyorum?

template <typename Container, typename T> 
bool 
foo (const Container <T> &); 

gr ++ gerçekten ne anlama geldiğini açıkça olmadığı bana Container is not a template verir.

template <typename Container> template <typename T> çalışılıyor de işe ne const typename Container <T> &

bir kap ve içerdiği tip ikisi üzerinde genel olduğu bir arabirim tanımlamak isteyeyim bana makul görünüyor yapar etmez.

Yani,

standartları bakımından
  • , neden bu izin verilmez?
  • tasarım standartları açısından neden buna izin verilmez, sorun çıkarır?
  • C++ 14'te, arabirimi yineleyicilerde temel almanın dışında bir geçici çözüm var mı?
+0

Neden Konteyner'i kullanıp T'den kurtulmuyorsunuz? –

+1

Neden işe yarayacak? Bir 'std :: vektörünü' geçemezsiniz, 'std :: vector '. Bunu yaparsanız, derleyicinin 'std :: vector ' yapmasını istemiyorsunuz. – NathanOliver

+0

Thing, derleyicinize, kendi genel parametresi verilmediği sürece, 2 jenerik parametrenizin tür olduğunu belirtiyorsunuz. – Loomchild

cevap

7

Bunu yapabilirsin:

template <template <class... > class Container, class T> 
bool foo (const Container<T> &); 

Bu sözdizimi (class...) container bağımsız değişken herhangi bir sayı ile bir şablondur derleyici söyler.

Unutmayın, template <class T>'u bulduğunuzda T türünün olmasını istiyorsunuz. std::vector bir tür değil, bir şablondur. std::vector<int> bir türüdür, ancak bu bir şablon değildir, dolayısıyla std::vector<int> <char> ürününe sahip olamazsınız.

+2

“std :: vector” için çalışacak olan “template class container” öğesini kullanabilirsiniz. – TartanLlama

+0

@TartanLlama, evet, kesinlikle. Düzenlenen. – SergeyA

İlgili konular