Reputation: 305
When can you omit the C++ template argument list? For example in Visual Studio 2010 this piece of code compiles fine:
template<class T>
Vec2<T> Vec2<T>::operator+ (const Vec2 &v) const
{
return Vec2(x + v.x, y + v.y);
}
If you inline the code, it actually compiles without any argument list. But is this really the same as the following version?
template<class T>
Vec2<T> Vec2<T>::operator+ (const Vec2<T> &v) const
{
return Vec2<T>(x + v.x, y + v.y);
}
Upvotes: 4
Views: 1542
Reputation: 23031
Inside a class you can omit the argument on the class type:
template<typename K>
struct A {
A<K> foo1; // legal
A foo2; // also legal and identical to A<K> foo
A bar(A x) {...} // same as A<K> bar(A<K> x) {...}
};
Outside of a class scope you need the template arguments:
// legal
template<typename K>
A<K> foo(A<K> x) { return A<K>(); }
// illegal!
template<typename K>
A foo(A x) { return A(); }
If you declare a member function outside the class, you need the template list for the return type and for the class:
// legal
template<typename K>
A<K> A<K>::bar(A<K> x) { return A<K>(x); }
// legal
template<typename K>
A<K> A<K>::bar(A x) { return A(x); }
// illegal!
template<typename K>
A A::bar(A<K> x) { return A<K>(x); }
Upvotes: 6