Kirjoittaja Aihe: c++ map arvojen lisääminen  (Luettu 2767 kertaa)

teele

  • Käyttäjä
  • Viestejä: 809
    • Profiili
c++ map arvojen lisääminen
« : 09.07.16 - klo:19.35 »

En millään keksi, miksi alla oleva map[avain] = arvo -tyylinen lisäys ei käänny alla olevassa ohjelmassa. Voisiko se johtua jotenkin siitä, että map:in arvoina on luokkia? Insert kuitenkin toimii hyvin.

Koodia: [Valitse]
#include <iostream>
#include <string>
#include <map>


class dp  // materialmap käyttää arvoina
{
  public:
    dp (const double a, const double b);

  double d1;
  double d2;
};

 dp::dp(const double a, const double b) : d1(a), d2(b) // dp-luokan muodostin
{ ; }

std::map<std::string, dp> materialmap;  // map, johon halutaan lisätä arvoja

int main()
{
  dp d(5, 6);  // lisättävän luokan olio
  std::cout << d.d1 + d.d2 << std::endl;  // olio toimii hyvin
  //materialmap["tunniste1"] = d; //  <--- TÄMÄ EI KÄÄNNY  ???????
  materialmap.insert(std::make_pair("tunniste1", d));
}

// g++ koe.cpp -o koe -Wall -pedantic -std=c++11

matsukan

  • Käyttäjä
  • Viestejä: 2148
    • Profiili
Vs: c++ map arvojen lisääminen
« Vastaus #1 : 09.07.16 - klo:22.03 »

Virheilmoitus ?
Pohjois-pohjanmaa
-- motto:  backupin tarve huomataan aina liian myöhään

hillo

  • Käyttäjä
  • Viestejä: 28
    • Profiili
Vs: c++ map arvojen lisääminen
« Vastaus #2 : 09.07.16 - klo:23.25 »
Default constructori puuttuu?
Koodia: [Valitse]
dp(){};

teele

  • Käyttäjä
  • Viestejä: 809
    • Profiili
Vs: c++ map arvojen lisääminen
« Vastaus #3 : 10.07.16 - klo:08.27 »

Virheilmoituksia tulee noin pari ruudullista. Tässä alla on mielestäni tärkeimpiä.

Koodia: [Valitse]
rex03koe.cpp:24:26:   required from here
/usr/include/c++/4.8/tuple:1090:70: error: no matching function for call to ‘dp::dp()’
         second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
                                                                      ^
/usr/include/c++/4.8/tuple:1090:70: note: candidates are:
rex03koe.cpp:15:2: note: dp::dp(double, double)
  dp::dp(const double a, const double b) : d1(a), d2(b) // dp-luokan muodostin
  ^
rex03koe.cpp:15:2: note:   candidate expects 2 arguments, 0 provided
rex03koe.cpp:6:7: note: constexpr dp::dp(const dp&)
 class dp  // materialmap käyttää arvoina
       ^
rex03koe.cpp:6:7: note:   candidate expects 1 argument, 0 provided
rex03koe.cpp:6:7: note: constexpr dp::dp(dp&&)
rex03koe.cpp:6:7: note:   candidate expects 1 argument, 0 provided

Oletusmuodostin olisi mielestäni ensin esitelty luokassa ja sitten määritelty vähän alempana.

Koodia: [Valitse]
#include <iostream>
#include <string>
#include <map>


class dp  // materialmap käyttää arvoina
{
  public:
    dp (const double a, const double b); // <--- oletusmuodostin

  double d1;
  double d2;
};

 dp::dp(const double a, const double b) : d1(a), d2(b) // dp-luokan muodostin
{ ; }  //  <--- oletusmuodostin määritelty

std::map<std::string, dp> materialmap;  // map

int main()
{
  dp d(5, 6);
  std::cout << d.d1 + d.d2 << std::endl;
  //materialmap["tunniste1"] = d; //  <--- TÄMÄ EI KÄÄNNY  ???????
  materialmap.insert(std::make_pair("tunniste1", d));
}

// g++ rex03koe.cpp -o rex03koe -Wall -pedantic -std=c++11


Käännöskomento on tässä viimeisellä rivillä.

Luokalle dp on siis mielestäni oletusmuodostin ja std::map ei kai sitä enää tarvinnekaam, se tullee valmiina luokan mukana?