В чем разница между 1 и 2, 3 и 4? Для меня это работает так же.
template<typename T>
class Foo
{
private:
T data;
public:
Foo(T data) : data(data) {} // 1.
Foo<T>(T data) : data(data) {} // 2.
Foo& operator=(const Foo& foo) // 3.
{
data = foo.data;
}
Foo<T>& operator=(const Foo<T>& foo) // 4.
{
data = foo.data;
}
};