4

数学プログラミング用のサイズと型のジェネリック ベクトル クラスを作成しようとしています。部分的な特殊化に問題があります。

この問題は、ベクター クラスのメンバ メソッドを特定のサイズに特化しようとすると発生します。

簡単な例を挙げることができます:

template <size_t Size, typename Type>
class TestVector
{
public:
    inline TestVector (){}
    TestVector cross (TestVector const& other) const;
};

template < typename Type >
inline TestVector< 3, Type > TestVector< 3, Type >::cross (TestVector< 3, Type > const& other) const
{
    return TestVector< 3, Type >();
}

void test ()
{
    TestVector< 3, double > vec0;
    TestVector< 3, double > vec1;
    vec0.cross(vec1);
}

この単純な例をコンパイルしようとすると、「クロス」特殊化が既存の宣言と一致しないというコンパイル エラーが発生します。

error C2244: 'TestVector<Size,Type>::cross' : unable to match function definition to an existing declaration
see declaration of 'TestVector<Size,Type>::cross'
definition
    'TestVector<3,Type> TestVector<3,Type>::cross(const TestVector<3,Type> &) const'
    existing declarations
    'TestVector<Size,Type> TestVector<Size,Type>::cross(const TestVector<Size,Type> &) const'

テンプレートとして cross を宣言しようとしました:

template <size_t Size, typename Type>
class TestVector
{
public:
    inline TestVector (){}

    template < class OtherVec >
    TestVector cross (OtherVec const& other) const;
};

template < typename Type >
TestVector< 3, Type > TestVector< 3, Type >::cross< TestVector< 3, Type > > (TestVector< 3, Type > const& other) const
{
    return TestVector< 3, Type >();
}

このバージョンはコンパイルに合格しますが、リンク時に失敗します:

 unresolved external symbol "public: class TestVector<3,double> __thiscall TestVector<3,double>::cross<class TestVector<3,double> >(class TestVector<3,double> const &)const

ここで何が欠けていますか? ありがとう、フロラン

4

2 に答える 2

1

crossこれを行う 1 つの方法は、「ファンクター」 (つまり、 を持つクラス) として定義することですoperator()

template<size_t S, typename T>
class Vec {
  // ... stuff
  friend struct Cross<S, T>;
  Vec<S, T> cross(const Vec<S, T>& other) {
    return Cross<S, T>()(*this, other);
  }
  // ... more stuff
};


template<size_t S, typename T> struct Cross {
  Vec<S, T> operator() (const Vec<S, T>& a, const Vec<S, T>& b) {
    // general definition
  }
};

// Partial specialization
template<typename T> struct Cross<3, T> {
  vec<3, T> operator() (const Vec<3, T>& a, const Vec<3, T>& b) {
    // specialize definition
  }
};
于 2012-11-21T14:41:37.923 に答える
0

メソッドを部分的に特殊化することはできません。特定の条件下で過負荷になる可能性があります。ここでは、クラスの部分的な特殊化を行うことができます

template <size_t Size, typename Type> class TestVector
{
public:
    inline TestVector (){}
    TestVector cross (TestVector const& other) const;
};

一般的な動作の定義:

TestVector<size_t Size, typename Type>::cross (TestVector const& other) const {
     // general
}

また、int が 3 の場合の特定の動作を定義できる特殊なテンプレート

template <typename Type> class TestVector<3, Type>
{
public:
    inline TestVector (){}
    TestVector cross (TestVector const& other) const;
};

カスタム動作の定義:

TestVector<typename Type>::cross (TestVector const& other) const {
     // custom
}
于 2014-05-12T12:00:13.040 に答える