< and > is referred to as the template parameter list of the class template. It cannot be empty.class or the keyword typename. template <sisz_t size = 1024>
class Buffer;
template <class T>
struct Buffer;
template <class U>
struct Buffer{
};
int main() {
Buffer<int> buf;
return 0;
}
class and the keyword typename have the same meaning. #include <iostream>
#include <string>
template <class T, int size = 1024>
class Buffer;
template <class T = std::string, int size>
class Buffer{
public:
Buffer(){ std::cout << "B\n";}
};
int main() {
Buffer buf;
return 0;
}
BufferItem* instead of BufferItem<T>* inside the BufferItem<T> class template. Note that this works only inside the class template definition. When BufferItem is used as a type specifier in another template definition, the full template parameter list must be specified.
#include <iostream>
#include <string>
template <class T>
struct BufferItem {
BufferItem(T item) : _item(item){}
T _item;
BufferItem* _next;
};
template <class T>
struct Buffer{
Buffer(BufferItem<T>& ival) : front(&ival){}
BufferItem<T>* front;
// BufferItem* front; // Error
};
int main() {
BufferItem<int> b(5);
Buffer<int> buf(b);
return 0;
}
#include <iostream>
#include <vector>
template<class C>
class B;
template<class C>
class A {
public:
A(const B<C>& b) : _x(b.getX()) {}
private:
C _x;
};
template<class C>
class B {
public:
B(C x) : _x(x) {}
C getX() const { return _x; }
private:
C _x;
};
int main() {
B<int> b(1);
A<int> a(b);
return 0;
}