0

私は学校の課題に取り組んでいますが、この奇妙なエラーが発生します (私は C++ にまったく慣れていません)。

1500 から 1900 の間の最初の値を見つける必要があります。最初にビルドするときはすべて問題ありませんが、次回ビルドすると次のエラーが発生します。

error LNK2005: "bool __cdecl greaterThan1500SmallerThan1900(int)" (?greaterThan1500SmallerThan1900@@YA_NH@Z) already defined in Lab5.obj

その後、コードを少し変更すると (述語関数の型を double に変更すると)、もう一度ビルドされます。

template<typename T>
T MyStlClass<T>::myFindIf(list<T> &theList) {

    list<T>::iterator it = find_if(theList.begin(), theList.end(), greaterThan1500SmallerThan1900);
    return *it;
}

bool greaterThan1500SmallerThan1900(int value){
    return (value >= 1500 && value <= 1900);
}

このサイトで、「.cpp」ファイルをインクルードしているためだと読んだことがありますが、一方で、テンプレートを使用しているときに「.cpp」ファイルをインクルードする必要があることも読みました。

4

3 に答える 3

1

テンプレートを使用している場合は、「.cpp」ファイルを含める必要があることも読みました。

捨てる/反対票を投じる/あなたにそうするように言ったリソースを私たちのために特定してください.

これには十分な理由がありますが、推奨事項が間違っていたため、この問題に直接つながっています。

決して。#include_.cpp

テンプレート定義を入れるファイルは、IDE が「通常の」ソース ファイルと混同してプロジェクトの残りの部分と一緒にビルドしないように、.ippではなく のような名前にする必要があります。.cppこのようなファイルは、a のように.hdのみです #include

于 2013-01-18T18:13:36.703 に答える
0

あなたgreaterThan1500SmallerThan1900はテンプレートではありません#include。そのため、その本体に複数回間違っています (そのため、正確に 1 回リンクする必要があります)。

この関数をテンプレート化されたものから分割する必要があります。この関数は、cpp ファイルにある必要があり、#includeプロジェクトに追加されることはありません。(それが呼び出された場所にすでに宣言があるようです-そのままにしておく必要があります)。

テンプレートの時点で、別の回答のアドバイス (名前を変更する、プロジェクトから削除する) に注意することが*.ippできますが#include、実行する前にエラーが消えます (追加のテンプレートのみのソース ファイルを空のオブジェクトにコンパイルすることは役に立ちませんが、そうではありません傷つく)。

于 2013-01-18T18:21:07.433 に答える
0

ヘッダーのみのライブラリ/モジュールを作成している場合は、#pragma once複数のインクルードを避けるために使用し、greaterThan1500SmallerThan1900関数をマークしますinline

// MyStlClass.hpp

#prgma once

....

template<typename T>
T MyStlClass<T>::myFindIf(list<T> &theList) {

    list<T>::iterator it = find_if(theList.begin(), theList.end(), greaterThan1500SmallerThan1900);
    return *it;
}

// NOTE inline here:
inline bool greaterThan1500SmallerThan1900(int value){
    return (value >= 1500 && value <= 1900);
}
于 2013-01-18T18:24:33.400 に答える