0

プログラマーが正しいコードを書くのに役立つテンプレート クラスを作成しようとしています。サンフランシスコからワシントンへのルートと、ワシントンからニューヨークへのルートを考慮して、サンフランシスコからワシントンを経由してニューヨークへのルートを計算します。サンフランシスコからロサンゼルス、ワシントンからニューヨークへのルートを指定すると、コンパイラはエラーを報告します。

これがクラスです(通常の主力機能なし):

extern const char miami[] = "Miami";

template< const char* FINISH, const char* START>
class Route {
public:
    Route();
    ~Route() {};

    template<const char* OTHERPLACE>
    Route<START, OTHERPLACE> alterFinish() const;
};

template<const char* START> // specialisation
template<const char* OTHERPLACE>
// Allow only miami as FINISH to be changed to something else.
Route<START, OTHERPLACE> Route<START, miami>::alterFinish() const{
    return Route<START, OTHERPLACE>();
}

残念ながら、これは機能しません。「不完全な型の無効な使用」エラーが発生します。特殊化されていない同じ種類の関数はコンパイルされます。私は何を間違っていますか?

4

1 に答える 1

2

invalid use of incomplete typeまだ宣言していないものを使用していることを示します。この場合、それは:の部分的な特殊化ですRoute

template <const char* START>
class Route<START,miami>{

    template<const char* OTHERPLACE>
    Route<START, OTHERPLACE> alterFinish() const;
};

なぜこれが必要なのですか?さて、あなたはメソッドを作成したいと思います。alterFinish()それはに特化する必要がありtemplate<class START> Route<START, miami>ます。フルネームはRoute<START, miami>::alterFinish()です。しかし、あなたはtemplate<class START> Route<START, miami>どこにも定義したことがありません。不完全な型であるため、コンパイラーはコンパイルできません。

しかし、私はあなたのプログラムに他のいくつかの問題があると信じています。テンプレートを使用する必要が本当にありますか?std::map<std::pair<city,city>, double>あなたの費用に対して十分なものではないでしょうか?あなたは本当にあなたの都市を文字列リテラルとして保存したいですか?

また、特別なシナリオでプログラムがクラッシュする理由も明確ではありません。十分なコードがまったくありません。必要な調整を追加して多くのシンボルを移動しない限り、提供したコードでもコンパイラエラーは発生しません。

于 2012-07-06T23:46:12.863 に答える