0

テンプレート クラスを実装していますが、署名が正しいかどうかわかりません。以下に、私が懸念しているいくつかの状況を示すコードのサンプルを含めました。

mymap.h:


#ifndef MAP_H
#define MAP_H
#include <iostream>
#include <string>

using namespace std;

template <typename KEY, typename T>
class Map{
private:
    struct Elem {

    };

public:

    Map();
    // constructs empty Map

    Map(const Map &rhs);

    ~Map();

    Map& operator=(const Map &rhs);

    bool insert(KEY, T);

    T& operator[](KEY);

};

template<typename KEY, typename T>
ostream& operator<< (ostream&, const Map<KEY, T>&);

#include "mymap.cpp"

#endif

そして今、.cpp ファイル:


#include mymap.h
#include <iostream>
#include <string>

using namespace std;

//Assingment Operator
template < typename KEY , typename T >
Map< KEY , T >& Map< KEY , T >::operator=(const Map &rhs){

    //Avoid self assignment
    if( this != &rhs ){

         //Snip
    }

    return *this;
}


//Insert, return true if successful.
template < typename KEY , typename T >
bool Map< KEY , T >::insert(KEY, T){

    //Snip
}

ご覧のとおり、そして皆さんもよくご承知のとおり、テンプレートの署名は、私が読んだものからかなり乱雑になる可能性があります。これは正しいように見えますか?それとも、熟練した目で簡単に認識できる盲目的なエラーがありますか?

テンプレートに関する投稿が 100 万件あることは知っています。それらに関するガイドをいくつか読みましたが、この特定の問題についてはまだあまり多くを見つけることができません。

また、避けられない「名前空間 std の使用を取り除く」コメントが表示される前に、デバッグ用に含めて、最終的にはなくなることを約束します:)

ありがとう!


編集: 混乱して申し訳ありません。投稿の非常に重要な部分を見逃していたようです...エラー!

私はこれらのうち約5つを持っていますが、すべてさまざまな行番号があります:

mymap.cpp:41:1: error: ‘Map’ does not name a type

および同数:

expected initializer before ‘&lt;’ token
4

1 に答える 1

2

から削除#include mymap.hしますmymap.cpp

それで

#include "mymap.h"

test.cpp

そしてそれをコンパイルします

g++ -g test.cpp

テンプレート クラスの場合、すべてがヘッダーにある必要があります。

于 2013-04-08T23:54:17.143 に答える