c++11 を使用する VS2012 では、なぜこれがコンパイルされるのですか?
template <typename T>
class Vector2
{
public:
Vector2(); //constructors
T Dot(const Vector2<T>& U, const Vector2<T>& V);
};
template <typename T>
inline T Vector2<T>::Dot(const Vector2<T>& U, const Vector2<T>& V) //ISSUE
{ return (U.x * V.x + U.y * V.y); }
しかし、これはしません:
template <typename T>
class Vector2
{
public:
Vector2(); //constructors
template<typename G>
G Dot(const Vector2<G>& U, const Vector2<G>& V);
};
template <typename G>
inline G Vector2<G>::Dot(const Vector2<G>& U, const Vector2<G>& V) //ISSUE
{ return (U.x * V.x + U.y * V.y); }
2番目はエラーを引き起こします:「関数定義を既存の宣言に一致させることができません」
後のテンプレート関数定義にGを使用する必要がないことに気付きました.2番目の宣言例と一致するように使用しました.
クラスとは異なる型を取るテンプレート クラスに関数を含めることはできませんか? ここで何が起こっているのか、そしてこのエラーから学べるテンプレートに関連するものを見つけることに非常に興味があります。