zrobiłem następujący programKiedy potrzebujemy .template skonstruować
#include <iostream>
#include <typeinfo>
template<class T>
struct Class
{
template<class U>
void display(){
std::cout<<typeid(U).name()<<std::endl;
return ;
}
};
template<class T,class U>
void func(Class<T>k)
{
k.display<U>();
}
int main()
{
Class<int> d;
func<int,double>(d);
}
Powyższy program nie robi skompilować ponieważ display()
jest funkcją członkiem szablon więc kwalifikacja .template
przed display()
musi być zrobione. Czy mam rację?
Ale kiedy zrobiłem następujący program
#include <iostream>
#include <typeinfo>
template<typename T>
class myClass
{
T dummy;
/*******/
public:
template<typename U>
void func(myClass<U> obj);
};
template<typename T>
template<typename U>
void myClass<T>::func(myClass<U> obj)
{
std::cout<<typeid(obj).name()<<std::endl;
}
template<class T,class U>
void func2(myClass<T>k)
{
k.template func<U>(k); //even it does not compile
}
int main()
{
myClass<char> d;
func2<char,int>(d);
std::cin.get();
}
Dlaczego k.func<char>(k);
nie kompiluje nawet po złożeniu .template
konstruktu?
pełne i kompletne Odpowiedź na to pytanie można znaleźć we wpisie Comeau C++ Szablony FAQ [ "Czym jest' -> template', '.template' i' :: template' o składni"] (http://www.comeaucomputing.com/techtalk/templates/#templateprefix). –
Utknąłem ... §5.2.5/1 mówi "Wyrażenie postfiksowe poprzedzone kropką lub strzałką ->, ** opcjonalnie po którym następuje szablon słowa kluczowego (14.8.1) **, a następnie identyfikator -expression, to wyrażenie postfiks. " Ale 14.8.1 wydaje się być niezwiązanym ze sobą, oprócz opisywania, w jaki sposób C++ jest w stanie rozwiązać szablony funkcji członków * bez * słowa kluczowego. Gdzie jest określone to słowo kluczowe? – Potatoswatter
@Potatoswatter: Słowo kluczowe jest oczywiście określone w Tabeli 3..11. ;-) (Co ważniejsze, to jest dobre pytanie). –