0

まず第一に、私は C++ への最初のステップを踏んでいると言わなければなりません。私は PHP から来たので、この基本的な質問を許してください。distance($str1, $str2)私は多くの代替案を探してテストしてきましたが、関数distanceが返すものを読み取るためにPHPでこれを行う方法を理解できないようです。

私がやろうとしているのは、2 つの文字列間のレーベンシュタイン距離を返すテンプレートを呼び出すことです。

これが私のコードです

template <class T> unsigned int edit_distance(const T& s1, const T& s2)
{
    const size_t len1 = s1.size(), len2 = s2.size();
    vector<vector<unsigned int> > d(len1 + 1, vector<unsigned int>(len2 + 1));

    d[0][0] = 0;
    for(unsigned int i = 1; i <= len1; ++i) d[i][0] = i;
    for(unsigned int i = 1; i <= len2; ++i) d[0][i] = i;

    for(unsigned int i = 1; i <= len1; ++i)
        for(unsigned int j = 1; j <= len2; ++j)

            d[i][j] = std::min( std::min(d[i - 1][j] + 1,d[i][j - 1] + 1),
                               d[i - 1][j - 1] + (s1[i - 1] == s2[j - 1] ? 0 : 1) );
    return d[len1][len2];
}

string text1="house";
string text2="houses";
edit_distance <int> (text1, text2);

問題はオンラインedit_distance <int> (text1, text2);であり、Xcode が示しているエラーは次のとおりです。C++ requires a type specifier for all declarations

繰り返しますが、これは本当に基本的なものに違いないことはわかっていますが、適切な方法が見つかりません。正しい方向へのヒントは大歓迎です。

ありがとう!

4

2 に答える 2

1

template <class T> unsigned int edit_distance(const T& s1, const T& s2)

型 T は、引数から直接推測できます。したがって、タイプを指定する必要はまったくありません。電話するだけ

edit_distance(text1, text2);

関数内から。これは、テンプレートでサポートされている任意のタイプに対して行うことができます。型がサポートされていない場合、コンパイル時にエラーが発生します。

推論できない場合にのみ、型を明示的に指定する必要があります。あなたの場合、指定した型 は、指定<int>した引数と一致しませんでした。

于 2012-09-29T21:02:06.950 に答える
1

私の疑いをテストするために、私はあなたのコードを取り、最小限のインクルードと using 宣言を追加して、コンパイラが呼び出しに到達してコンパイルできるようにしましedit_distanceた。コンパイルしたファイルの完全な内容は次のとおりです。

#include <vector>
#include <string>
#include <algorithm>
using std::vector;
using std::string;

template <class T> unsigned int edit_distance(const T& s1, const T& s2)
{
    const size_t len1 = s1.size(), len2 = s2.size();
    vector<vector<unsigned int> > d(len1 + 1, vector<unsigned int>(len2 + 1));

    d[0][0] = 0;
    for(unsigned int i = 1; i <= len1; ++i) d[i][0] = i;
    for(unsigned int i = 1; i <= len2; ++i) d[0][i] = i;

    for(unsigned int i = 1; i <= len1; ++i)
        for(unsigned int j = 1; j <= len2; ++j)

            d[i][j] = std::min( std::min(d[i - 1][j] + 1,d[i][j - 1] + 1),
                               d[i - 1][j - 1] + (s1[i - 1] == s2[j - 1] ? 0 : 1) );
    return d[len1][len2];
}

string text1="house";
string text2="houses";
edit_distance <int> (text1, text2);

そして、私の疑いはチェックアウトしました。次のエラーが発生しました。

main.cpp:26:22: error: C++ requires a type specifier for all declarations
edit_distance <int> (text1, text2);
                     ^~~~~

これはあなたが言及した正確なエラーです。したがって、私のテスト ソース コードに含めたのと同じ間違いを犯した可能性が非常に高いと思います。ほとんどの経験豊富なプログラマーは、簡潔にするために不完全なコードがそのまま示されていると想定し、このエラーを完全に回避する周囲のコードを自動的に挿入します。


あなたが理解していないことは、C++ コードではどこにも行かないということです。C++ プログラムは、インタープリターがソースでそれらを読み取るときに実行される一連のステートメントではありません。

C++ はコンパイル済み言語です。プログラムは、関数、クラスなどの一連の宣言と定義です。ステートメント、つまり何かを行うコードは、定義内にのみ入ります。関数呼び出しedit_distance<int>(text1, text2);は定義内にないため、コンパイラはステートメントを期待しておらず、何を言っているのかわかりません。したがって、それを定義の中に入れます。おそらく関数定義を使用したいでしょう:

void foo() {
    string text1="house";
    string text2="houses";
    edit_distance <int> (text1, text2);
}

また、コンパイルされたコードが実行されると、特別なエントリ ポイント関数 main で実行が開始されます。このエントリ ポイントから到達可能なコードのみが実行されます。(実際にはこれは真実ではありませんが、他のケースは現時点では関係ありません。)

したがって、最終的に実行したいコードにつながるメイン関数が必要です。main上記の を呼び出すこともfoo、コードを に直接配置することもできますmain

int main() {
    string text1="house";
    string text2="houses";
    edit_distance <int> (text1, text2);
}

<int>部分が正しくないため、このコードはまだコンパイルされません。山かっこ内の型Tは、edit_distance 関数テンプレートで割り当てられた型になります。

template <class T> unsigned int edit_distance(const T& s1, const T& s2)

edit_distance<int>Tをintに等しく設定するように言います:

unsigned int edit_distance(const int& s1, const int& s2)

そして、それはあなたが望むものではありません。s1 および s2 パラメータが文字列になるように、T を文字列に等しく設定することをお勧めします。

int main() {
    string text1="house";
    string text2="houses";
    edit_distance<string>(text1,text2);
}

次に、戻り値を実際に確認したいと思うでしょう。他のインクルードと共にソースの先頭に追加#include <iostream>してから、main 関数を使用します。

int main() {
    string text1="house";
    string text2="houses";
    std::cout << edit_distance<string>(text1,text2) << '\n';
}

完全でコンパイル可能なプログラム

于 2012-09-29T19:45:15.230 に答える