0

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番目の宣言例と一致するように使用しました.
クラスとは異なる型を取るテンプレート クラスに関数を含めることはできませんか? ここで何が起こっているのか、そしてこのエラーから学べるテンプレートに関連するものを見つけることに非常に興味があります。

4

2 に答える 2

4

と の 2 つのテンプレート タイプがTありGます。1 つのリスト ( T) はクラス用で、 1 つのリスト ( ) はGメンバー関数用です。したがって、2 つのリストが必要です。Tクラス用に 1 つ、次に関数用に 1 つ (そして、適切な型がクラス名の後とパラメーター内の適切な場所に配置されていることを確認しGてください):

template<typename T>
template<typename G>
inline G Vector2<T>::Dot(const Vector2<G>& U, const Vector2<G>& V)
{ return (U.x * V.x + U.y * V.y); }
于 2013-02-07T01:57:53.883 に答える
2

2 つの個別のテンプレート宣言が必要です。

template <class T>
template <class G>
inline G Vector2<T>::Dot(const Vector2<G>& U, const Vector2<G>& V) {...}
于 2013-02-07T01:58:52.847 に答える