2016-05-17 13 views
1

私は現在、鳩のハッシングを実装するクラスのプロジェクトに取り組んでいますC++。問題は、C++と私は決して友人ではなかったと私は思っていません。'const std :: __ 1 :: basic_string <char>'から 'std :: __ 1 :: basic_string <char> *'への実行可能な変換はありません。 '

具体的な問題は、私はすでに既存のオブジェクトにポインタを設定することはできません。私がそうするとき、私はコンパイルエラーを取得:

エラーが両方のために発生する 'のconstのstd :: __ 1 ::のbasic_stringに' のstd :: __ 1 ::をのbasic_string「*からのいかなる実行可能な変換ありませんステートメント:

E * activeE = e; 
E * tempE = v1[pos]; 

v1はEオブジェクトの配列です。

私はこのエラーは、C++の基本的な考え方の誤解が原因だと思います。私はあなたにこの問題は冗談だと思うが、とにかく私を助けてくれることを願っています。

template <typename E, size_t N> 
void Hashing<E,N>::add_(const E& e) { 

    size_t pos = h1(e); 
    size_t i = 0; 

    E * activeE = e; 
    E * tempE = v1[pos]; 

    while (i < nmax) { 
     if (tempE == NULL) { 
      v1[pos] = activeE; 
      break; 
     } 

     v1[pos] = activeE; 
     activeE = tempE; 

     pos = h2(activeE); 
     tempE = v2[pos]; 

     if (tempE == NULL) { 
      v2[pos] = activeE; 
      break; 
     } 

     v2[pos] = activeE; 
     activeE = tempE; 

     pos = h1(activeE); 
     tempE = v1[pos]; 
    } 

} 
+0

エラーメッセージの最後に '*'があるはずです。星に注意を払う、それらはC++で重要です。 –

+0

あなたはポインタと参照を混同しています。 –

+1

参照変数をポインタ変数に代入しています。タイプが一致しません。しかし、あなたが提供するエラーメッセージがあなたのコードと一致しません。 – davmac

答えて

1

あなたはHashing<E,N>::add_方法でconst E& eを持っていますが、その中にあなたがEへのポインタをeを割り当てる - 実際にこれが別のエラーを生成する必要があります:

'const std::__1::basic_string to 'std::__1::basic_string*" 
                 ^

ので、このための修正プログラムは、さ変更するには:

E * activeE = e; 
E * tempE = v1[pos]; 

const E * activeE = &e; 
const E * tempE = &v1[pos]; 
+0

ありがとうございました! – backfloep

+3

しかし、 'const'参照を介して渡されたパラメータのアドレスは、一時的なものを参照する可能性があるので、避けています。パラメータの型をポインタに変更する方が良いか、 - (おそらくさらに良い) - 値をコピーします(ポインタを格納する場合は、ポインタ型に 'E'が必要です)。 – davmac

+0

@backfloep 'Hashing 'インスタンスライフの間、各 'E'インスタンスが生きていることを確認してください。そうしないと、デフオルト動作(==クラッシュ)になります。最良のaproachはstdライブラリが何をしているのか、コンテナはオブジェクトを値で保持します。スピードが必要な場合は、 'Hashing'コンテナが移動セマンティクスを使用できるようにします。 – marcinj

1

I get the compile error:

No viable conversion from 'const std::__1::basic_string to 'std::__1::basic_string"

よろしいですか?私はそれがエラーが言っているとは思わない。私はそれが言う賭け:

No viable conversion from 'const std::__1::basic_string to 'std::__1::basic_string*'

非常に重要であり、そして、あなたの問題の原因である余分な*を。エラーメッセージに注意を払う必要があります。詳細は重要です。

ポインタは、他のもののアドレスを保持する変数です。オブジェクトへのポインタを作成するには、 "address of"演算子&を使用してそのオブジェクトのアドレスを取得する必要があります。

E* activeE = &e; 

今あなたがeconstであるためである、取得するために主張し、エラーを取得しますが、あなたはそれに非constポインタを作成しようとしています。これは、あなたがポインタを通してconstオブジェクトを変更できるようにするため、禁止されています。次のものが必要です。

const E* activeE = &e; 
+0

あなたは正しいです、私は '*'を忘れました。私はそれを変えた。 – backfloep

+0

ありがとう、それは魅力のように動作します! – backfloep

+1

私がmarcinjの答えで指摘したように、 'const'参照として渡されたパラメータのアドレスを取っている(特に格納している)のは良いことではありません。パラメータは一時的なものを参照することがあります。 – davmac

1

const E& e ... E * activeE = e;

私はあなたがそのような*&としてそのエラーメッセージからいくつかの選択の文字を、逃した賭けます。ポインターにEの値を割り当てようとしています。

オブジェクト、値、アドレスの違いについて不明な点があるので、v1vector<E>vector<E*>かどうかはわかりません。そして、その延長線をどのように修正すべきかを推測するつもりはない。全く異なる意味を持つ少なくとも2つの修正があります。

+0

あなたは正しいです、私は '*'を忘れました。私はそれを変えた。 – backfloep

関連する問題