2011-11-09 27 views
13

Std adlı kullanıcının değer_tipini nasıl kullanması gerekiyor? Bu value_type için ne :: olduğunu düşünmüşŞablonlu bir parametrenin değerini kullanma

prog.cpp:10: error: ‘T::value_type’ is not a type 
prog.cpp:14: error: type ‘T’ is not derived from type ‘TSContainer<T>’ 
prog.cpp:14: error: expected ‘;’ before ‘pop’ 
prog.cpp:19: error: expected `;' before ‘}’ token 
prog.cpp: In function ‘int main()’: 
prog.cpp:25: error: ‘class TSContainer<std::vector<int, std::allocator<int> > >’ has no member named ‘pop’ 
prog.cpp:25: warning: unused variable ‘v’ 

:
Öyle gibi kullanmaya çalıştı:

#include <vector> 

using namespace std; 

template <typename T> 
class TSContainer { 
private: 
     T container; 
public: 
     void push(T::value_type& item) 
     { 
       container.push_back(item); 
     } 
     T::value_type pop() 
     { 
       T::value_type item = container.pop_front(); 
       return item; 
     } 
}; 
int main() 
{ 
     int i = 1; 
     TSContainer<vector<int> > tsc; 
     tsc.push(i); 
     int v = tsc.pop(); 
} 

Ama bu sonuçlanır?

+0

olası bir kopyası [Nerede ve neden "şablon" ve "typename" anahtar kelimeleri koymak zorundayım?] (Http://stackoverflow.com/questions/610245/where-and-why-do-i-have -to-put-the-template-and-typename-keywords) –

+1

Yeniden kullanılabilir kitaplık kodu yazarken (hatta, hiç), ayrıca 'namespace std;' kullanarak söylenmemesi önerilir. Sadece doğru ad alanını heceleyin. –

+0

@KerrekSB: Bu bir örnekti. –

cevap

21

Sen typename kullanmak zorunda: vb

typename T::value_type pop() 

ve.

Bunun nedeni, derleyicinin T :: value_type öğesinin bir üye değişkeni olup olmadığını bilmemesidir (kimse, struct X { int value_type; }; türünü tanımlamanızı engeller ve bunu şablona aktarır). Bununla birlikte, bu işlev olmadan kod ayrıştırılamamıştır (yapıların anlamı, bazı tanımlayıcıların bir tip veya bir değişken tanımladığına bağlı olarak değişmektedir, örneğin, T * p bir çarpım veya bir işaretçi beyanı olabilir). Bu nedenle, kural, tür veya değişken olabilecek ve typename ile önek eklenerek açık bir şekilde işaretlenmemiş olan her şeyin bir değişken olarak kabul edilmesidir.

+0

Açıklama için teşekkürler! –

+0

@Jonathan: Daha fazla açıklama için, ayrıca şu SSS'ye de bakınız: ['typename' anahtar sözcüğü ne için kullanılır?] (Http://www.comeaucomputing.com/techtalk/templates/#typename) – ildjarn

7

Gerçekten bir tür olduğunu belirtmek için typename anahtar sözcüğünü kullanın.

void push(typename T::value_type& item) 

typename T::value_type pop() 
İlgili konular