2010-05-02 3 views
0

я использовал простой класс для тестовой программы о шаблонах, это то, что я сделал:Вопрос о C++ Templates

template <typename T> 
class test 
{ 
public: 
    test<T>::test(); 
    T out(); 
}; 

template <typename T> 
test<T>::test() 
{ 
} 

T test<T>::out() 
{ 
} 

int main() 
{ 
    //test<int> t; 
} 

Но когда я пытаюсь скомпилировать это говорит «T»: необъявленный идентификатор и для использования шаблона класса требуется список аргументов шаблона, указывая на ту же строку, где я реализовал метод out(). Может кто-нибудь объяснить, в чем проблема? Я использую visual studio 2008.

ответ

0

В вашем определении члена out отсутствует список аргументов шаблона. из следует читать: -

template <typename T> 
T test<T>::out() 
{ 
} 
+0

OP не отступал от кода, поэтому '' был взят как неизвестный элемент HTML и проигнорирован. –

+0

Упс - хороший момент, хотя я думаю, что ответ по-прежнему прав - я просто получил неверный список аргументов. – Stewart

+0

@Marcelo Cantos - изменен. Спасибо за отзыв – Stewart

0

Эта линия является неправильным:

test<T>::test(); 

Просто напишите это:

test(); 
+0

Это неправильно; который просто определит новую свободную функцию вместо метода класса. – tzaman

+0

Думаю, я должен был быть яснее. Я имею в виду объявление в классе, а не определение после. (Точка с запятой должна отдать ее.) –

+0

О, не видел этого. - (- 1) :) – tzaman

5

После является более точным:

template <typename T> 
class test 
{ 
public: 
    test(); 
    T out(); 
}; 

template <typename T> 
test<T>::test() 
{ 
} 

template <typename T> 
T test<T>::out() 
{ 
} 

1) Дон Использовать <T> внутри класса 2) Не забудьте объявить шаблон <T> перед каждым объявлением метода из класса тела