2017-09-20 7 views
-3

編集:私は以下の私のコードを貼り付け、誰かが喜ばことができれば何が起こっていることの代わりに、単純に私を書くのが起こっている理由を私に説明します初心者C++ - トラブルコンパイル私のコードを持つ

以下の作業のコード答え、それは大変ありがとうございます、ありがとう!

私にコンパイルエラーがありますが、私にはno instance of overloaded functionと言っています。このコンパイルエラーを回避するには、cin.get(Kingdom.m_name, 32, '\n');という行をコメントアウトしてください。しかし、私のプログラムは最初の王国の名前を入力した後で終了するので、これは明らかに役に立たないです。

私は、void read(sict::Kingdom& Kingdom)と入力すると、コンピューターがユーザーの入力に基づいて自分のキングダムアレイを循環すると仮定します。

`

//implementation .cpp 
#include <iostream> 
#include <cstdlib> 
#include "Kingdom.h" 
using namespace std; 
// TODO: the sict namespace 
namespace sict 
{ 
    // TODO:definition for display(...) 

    void display(const Kingdom& pKingdom) { 
     cout << pKingdom.m_name << ", " << "population " << pKingdom.m_population << endl; 
    } 

    void display(const Kingdom kingdoms[], size_t count) { 
     cout << "------------------------------" << endl; 
     cout << "Kingdoms of SICT" << endl; 
     cout << "------------------------------" << endl; 
     int pop = 0; 
     for (size_t i = 0; i < count; i++) { 
      cout << i + 1 << ". "; 
      display(kingdoms[i]); 
       pop += kingdoms[i].m_population; 
     } 
     cout << "------------------------------" << endl; 
     cout << "Total population of SICT: " << pop << endl; 
     cout << "------------------------------"; 
    } 
} 

そして、私のメインの

//header file 
#ifndef KINGDOM_H 
#define KINGDOM_H 
#include <cstdlib> 
// TODO: sict namespace 
namespace sict 
{ 
    // TODO: define the structure Kingdom in the sict namespace 

     struct Kingdom { 
      char m_name[32]; 
      int m_population; 
     }; 
     // TODO: declare the function display(...), 
     //   also in the sict namespace 
     void display(const Kingdom& pKingdom); 
     void display(const Kingdom kingdoms[], size_t count); 
} 


#endif 

は、

#include <iostream> 
    #include <cstring> //for size_t definition 
    #include <vector> 
    #include "Kingdom.h" 

    using namespace std; 
    using namespace sict; 

    void read(Kingdom&); 

    int main() { 
     int count = 0; // the number of kingdoms in the array 

     // TODO: declare the pKingdom pointer here (don't forget to initialize it) 
     Kingdom *pKingdom = nullptr; 
     cout << "==========\n" 
      << "Input data\n" 
      << "==========\n" 
      << "Enter the number of Kingdoms: "; 
     cin >> count; 
     cin.ignore(); 

     if (count < 1) return 1; 

     // TODO: allocate dynamic memory here for the pKingdom pointer 
     pKingdom = new Kingdom[count]; 
     for (int i = 0; i < count; ++i) { 
      cout << "Kingdom #" << i + 1 << ": " << endl; 
      // TODO: add code to accept user input for Kingdom i 
      read(pKingdom[i]); 
     } 
     cout << "==========" << endl << endl; 

     // testing that "display(...)" works 
     cout << "------------------------------" << endl 
      << "The 1st Kingdom entered is" << endl 
      << "------------------------------" << endl; 
     display(pKingdom[0]); 
     cout << "------------------------------" << endl << endl; 

     // expand the array of Kingdoms by 1 element 
     count = count + 1; 
     Kingdom *cpy_pKingdom = nullptr; 
     // TODO: allocate dynamic memory for count + 1 Kingdoms 
     cpy_pKingdom = new Kingdom[count]; 
     // TODO: copy elements from original array into this newly allocated array 
     for (int i = 0; i < count; i++) { 
      cpy_pKingdom[i] = pKingdom[i]; 
     } 
     // TODO: deallocate the dynamic memory for the original array 
     delete[] pKingdom; 
     // TODO: copy the address of the newly allocated array into pKingdom pointer 
     pKingdom = cpy_pKingdom; 
     // add the new Kingdom 
     cout << "==========\n" 
      << "Input data\n" 
      << "==========\n"; 
     cout << "Kingdom #" << count << ": " << endl; 
      // TODO: accept input for the new element in the array 
      read(pKingdom[count - 1]); 
     cout << "==========\n" << endl; 

     // testing that the overload of "display(...)" works 
     display(pKingdom, count); 
     cout << endl; 

     // TODO: deallocate the dynamic memory here 
     //delete[] pKingdom; 
     //delete[] cpy_pKingdom; 
     getchar(); 
     return 0; 
    } 

    // read accepts data for a Kingdom from standard input 
    // 
    void read(Kingdom& pkingdom) { 
     cout << "Enter the name of the Kingdom: "; 
     cin.get(pkingdom.m_name, 32, '\n'); 
     cin.ignore(2000, '\n'); 
     cout << "Enter the number of people living in " << pkingdom.m_name << ": "; 
     cin >> pkingdom.m_population; 
     cin.ignore(2000, '\n'); 

これは非常に頭痛することができ、そして私の帽子は、このすべてを介して行っているそこにすべてのプログラマに消灯します。

+1

'char'として何かを宣言すると、配列やポインタではなく' char'です。 – LogicStuff

+1

コンパイルエラーの理由は、 'char'、' streamsize'、 'char'型の引数をとる' istream :: get'の標準的なオーバーロードがないからです。私は明白な修正は 'char m_name;'を 'char m_name [32];'に変更することだと思いますが、おそらく 'std :: string'を代わりに使うべきです:) – George

答えて

0

はistream :: GETは、以下のオーバーロード(http://en.cppreference.com/w/cpp/io/basic_istream/getの礼儀)を持つ:

(1)  int_type get(); 
(2)  basic_istream& get(char_type& ch); 
(3)  basic_istream& get(char_type* s, std::streamsize count); 
(4)  basic_istream& get(char_type* s, std::streamsize count, char_type delim); 
(5)  basic_istream& get(basic_streambuf& strbuf); 
(6)  basic_istream& get(basic_streambuf& strbuf, char_type delim); 

次の3つの引数を持つ、上記の過負荷から抜け出す呼び出している、唯一の(4)と一致します。

ご覧のとおり、最初の引数としてchar ポインタが必要です。ここでは、charを渡します。 (m_name)

私は文字配列(char m_name [128]など)としてm_nameを定義することを考えました。

+0

ヒント:cplusplus.comよりもcppreference.comを優先します参照サイトが必要です。後者はあまりにも多くのエラーを持ち、前者は通常より正確です。 –

1

istream::getの6つのオーバーロードがあります。あなたが渡す引数は、それらのどれとも一致しません。そのため、コンパイラはその行をコンパイルできません。

問題は、メンバー変数Kingdomnamecharを使用していることです。それは正しいとは言えません。名前は通常文字列です。それはchar名前を表すために使用することはできません。

nameは、タイプstd::stringまたはcharのアレイに変更できます。 charの配列を使用する場合は、あなたのように関数呼び出しを使用できます。あなたがnameためstd::stringを使用

struct Kingdom { 
    char m_name[32]; // Since you are passing 32 to cin.get 
    int m_population; 
}; 

、あなたはstd::getlineを使用する必要があります。

struct Kingdom { 
    std::string m_name; 
    int m_population; 
}; 

と...

std::getline(std::cin, Kingdom.m_name); 

私はstd::stringを使用することをお勧めします。彼らは仕事がはるかに簡単です。