2017-11-17 1 views
0

次のコードはコンパイルされません(Ideoneリンク:https://ideone.com/DKI9Fm)。なぜ?:この行はなぜコンパイルされませんか?

EDITstd::mapdocumentationを1として、const Key&タイプはstd::map::findによって受け入れられています。したがってconst int*find()に渡すのは問題ありません。

#include <iostream> 
#include <map> 
using namespace std; 

class ConstDemo 
{ 
    std::map<int*, int> m_Map; 

public: 
    ConstDemo(int count, int* pArray) 
    { 
     for(int i=0; i < count; ++i) 
     { 
      m_Map.insert(std::make_pair(&(pArray[i]),0)); 
     } 

    } 

    bool Find(const int* i) const 
    { 
     // DOESN"T COMPILE! 
     return (m_Map.find(i) != m_Map.end()); 
    } 


}; 


int main() { 

    int a[10]; 
    ConstDemo cd(10, a); 
    if(cd.Find(&a[5])) 
     cout << "Found!" << std::endl; 


    return 0; 
} 
+0

ここでは、/ usr/include/C++/6/bits/stl_map.h:1079:7:注意:引数1の変換は不正です: prog.cpp:22:28:エラー: 'const int *'から 'std :: map'への無効な変換 :: key_type {aka int *} '_ – pirho

+0

マップ内のキーとしてのポインタはほとんど常に間違っています。 –

答えて

2

const int*int* constは同じではありません。 int* constにそれを変更してみてください:

bool Find(int* const i) const 

あなたkey_typeint*std::map<int*, int> m_Map;)であるためです。 m_Map.findconst key_typeをパラメータとして使用します(例:int* const)。しかし、あなたはconst int**を渡しています。

あなたはm_Map.findint*を渡すと、それはint* constint*に変換することができますが、それはconst int*int*を変換することはできませんので、それは、あまりにも大丈夫だろう。

そしてまた、次の行はint mainの終わりにセミコロンがあります:今

ConstDemo cd(10, a) 

Ideoneにここでそれを参照してください。

EDIT:あなたのケースでは、あなたが今、一定 int*を渡す必要があるので、編集後

あなたの質問

As per documentation of std::map , const Key& type is accepted by std::map::find . So passing const int* to find() should be okay.

const Key&では、一定のKeyです。しかし、const int*は定数int*を定義していないだけで、const intへのポインタを定義するだけです。 int* constは定数int*を定義しています。そのため、const int*を渡すとエラーになります。

0

短い答え:

使用

bool Find(int* i) const { ... } 

長い答え:C++ 11まで

std::map::findの宣言:

iterator find(const Key& key); 
const_iterator find(const Key& key) const; 

引数TY peはKeyまたはKey&ではなくconst Key&です。

あなたの場合

Keyint*ある、ないcons int*

我々は宣言でKeyに置き換えた場合、彼らは次のようになります。

iterator find(int * const & key); // Not "const int*&" 
            // That's unforunate part 
const_iterator find(int * const & key) const; 

このような機能は、そのタイプである変数を呼び出すことはできませんconst int*。これは、関数がポインターが指すオブジェクトの度合いを破ることを可能にします。

0

忘れたセミコロンなどのマイナーエラーを無視すると、コンパイルされない関数で正しい型が必要です。私の場合、私はそう単純でint*にタイプを変更し、慎重にエラーメッセージを読み、

note: conversion of argument 1 would be ill-formed: main.cpp:22:28: error: invalid conversion from 'const int*' to 'std::map::key_type {aka int*}' [-fpermissive]'

を見て、エラーを修正し、プログラムをコンパイルします。

#include <iostream> 
#include <map> 
using namespace std; 

class ConstDemo { 
    map<int*, int> m_Map; 

public: 
    ConstDemo(int count, int* pArray) { 
     for(int i=0; i < count; ++i) { 
      m_Map.insert(make_pair(&(pArray[i]),0)); 
     } 

    } 
    bool Find(int* i) const { 
     // DOESN"T COMPILE! 
     return (m_Map.find(i) != m_Map.end()); 
    } 
}; 

int main() { 
    int a[10]; 
    ConstDemo cd(10, a); 
    if(cd.Find(&a[5])) 
     cout << "Found!" << endl; 
    return 0; 
} 

コンパイルに向かって作業する別の方法は、タイプをautoに置き換えることです。これにより、コンパイラはコンパイル時に変数の型を選択できるようになり、複雑なカスタム変数の型がある場合には、入力領域が節約されます。私は、これがプログラムの唯一のエラーであるかどうかを確認するために使用しました。

関連する問題