2

テンプレート パラメータに関して、テンプレート クラスの [] 演算子をオーバーロードしたいと思います。そのようです:

template<
    typename T,
    template<typename> class Property, 
    template<typename> class Key1, 
    template<typename> class Key2>
class a_map 
{
public:
    const Property<T>& operator[](const Key1<T>& k) const
    { return _values[k.index()]; }
    const Property<T>& operator[](const Key2<T>& k) const
    { return _values[k.index()]; }
protected:
    std::vector<Property<T> > _values;
};

このクラスを次のように使用します。

int main()
{
    a_map<float, prop, key_a, key_b> pm;
}

_values基本的に、型をあまり気にせずにベクター内の要素にアクセスできるようにしたいと考えていKeyます。index()重要なのは、メンバーがいるということだけです。

ただし、次のエラーが表示されます

エラー C2535: 'const Property &a_map::operator [](const Key1 &) const': メンバー関数は既に定義または宣言されています

key_aとは 2 つのまったくkey_b異なるタイプのクラス テンプレートですが。

何か不足していますか?コンパイラは、特定の状況Key1<T>Key2<T>実際に同じ型になる可能性があることを恐れていますか?

編集 これらは、で使用されるクラス テンプレートです。main

template<typename T>
struct prop 
{
    T weight;
    T height;
};


template<typename T>
class key_a
{
public:
    int index() { return _i; }
private:
    int _i;
};

template<typename T>
class key_b
{
public:
    int index() { return 3; } // Always return 3

編集 MVC++ 2008 コンパイラを使用しています。

4

3 に答える 3

1

operator[] は両方とも引数の型を除いて同じなので、それらをテンプレート化しないのはなぜですか?

    template <typename TT>
    const Property<T>& operator[](const TT& k) const
    {
        return _values[k.index()];
    }
于 2012-07-21T21:22:43.407 に答える
1

テンプレート内でオブジェクトを介して呼び出すため、index()関数を次のように宣言する必要があります。consta_mapconst

template<typename T> class key_a {
public:
    int index() const // <- `const` is necessary
      { return _i; }
private:
    int _i;
};

template<typename T> class key_b {
public:
    int index() const // <- `const` is necessary
      { return 3; } 
};

しかし、そうでなければ、すべてがコンパイルされ、私にとってはうまく機能します。


VS2010 コンパイラで試してみると、あなたと同じエラーが発生します。これは明らかに、MSVC++ コンパイラのコンパイラ バグです。template-template 引数の処理が正しく実装されていません。

問題を回避するために、この手法を使用できました

template<
    typename T,
    template<typename> class Property, 
    template<typename> class Key1, 
    template<typename> class Key2>
class a_map 
{
public:
    const Property<T>& operator[](const typename Key1<T>::self& k) const
    { return _values[k.index()]; }
    const Property<T>& operator[](const typename Key2<T>::self& k) const
    { return _values[k.index()]; }
protected:
    std::vector<Property<T> > _values;
};

キーテンプレートを次のように定義します

template<typename T> class key_a {
public:
    typedef key_a self;
    int index() const { return _i; }
private:
    int _i;
};

template<typename T> class key_b {
public:
    typedef key_b self;
    int index() const { return 3; } 
};

これは洗練されていませんが、MSVC++ コンパイラで正しく動作します。

于 2012-07-21T21:28:06.997 に答える
0

このようにうまくコンパイルします...Prop/ K1/K2がどのように定義されるべきか注意してください。

#include <vector>

template<
    typename T,
    template<typename> class Property, 
    template<typename> class Key1, 
    template<typename> class Key2>
class a_map 
{
public:
    const Property<T>& operator[](const Key1<T>& k) const
    { return _values[k.index()]; }
    const Property<T>& operator[](const Key2<T>& k) const
    { return _values[k.index()]; }
protected:
    std::vector<Property<T> > _values;
};

template <typename T> struct K1 { int index() const { return 0; } };
template <typename T> struct K2 { int index() const { return 0; } };
template <typename T> struct Prop { };

int main()
{
    a_map<float, Prop, K1, K2> m;
}
于 2012-07-21T21:14:27.567 に答える