0

他のインターフェイスから受信したデータを変更する次のクラスがあるとします。

template <class T>
class Updater
{
public:
    Updater():
        _db(Database<T>())
    {
    }

void append(T value)
{
    std::list<T> l = _db.get();
    l.push_back(value);
    _db.set(l);
}

void remove(T value)
{
    std::list<T> l = _db.get();
    l.remove(value);
            _db.set(l);
}

private:
    Database<T> _db;
};

だから私はintやfloatなどでこれを使っています。リンクされたリストを取得し、それを操作します。

しかし、このクラスを使用して次のタイプで作業したいとしましょう。

std::pair<std::string, std::shared_ptr<void>>

つまり、名前に関連付けられたメモリのブロックです。

上記の append 関数をそのまま使用して、連結リストにさらにメモリを追加してから、db に戻すことができます。ただし、名前 (ペアの文字列部分) に基づいてブロックを削除したい場合は、次のように特化してこれを解決できると考えました。

template <>
void MultiValue<std::pair<std::string, std::shared_ptr<Block>>>::remove(std::string value)
{
}

しかし、以前の定義と互換性がないことを訴えて、コンパイルしません。

これを解決する方法について何か提案はありますか?

4

1 に答える 1

0

クラステンプレートのメソッドだけを特殊化する場合は、シグネチャを同じに保つ必要があります。

署名を変更する場合は、クラス全体を特殊化する必要があります。

template<>
class Updater<std::pair<std::string, std::shared_ptr<Block>>>
{
   ...
}
于 2012-07-12T14:52:44.067 に答える