省略C ++模板参数列表时的区别

时间:2010-09-11 09:46:49

标签: c++ templates arguments

什么时候可以省略C ++模板参数列表?例如,在Visual Studio 2010中,这段代码编译得很好:

template<class T>
Vec2<T> Vec2<T>::operator+ (const Vec2 &v) const
{
    return Vec2(x + v.x, y + v.y);
}

如果你内联代码,它实际上编译时没有任何参数列表。但这是否与以下版本完全相同?

template<class T>
Vec2<T> Vec2<T>::operator+ (const Vec2<T> &v) const
{
    return Vec2<T>(x + v.x, y + v.y);
}

1 个答案:

答案 0 :(得分:4)

在类中,您可以省略类类型的参数:

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) {...}
};

在类范围之外,您需要模板参数:

// legal
template<typename K>
A<K> foo(A<K> x) { return A<K>(); }

// illegal!
template<typename K>
A foo(A x) { return A(); }

如果在类外部声明成员函数,则需要返回类型和类的模板列表:

// 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); }