Ubuntu Suomen keskustelualueet

Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: teele - 09.07.16 - klo:19.35

Otsikko: c++ map arvojen lisääminen
Kirjoitti: teele - 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
Otsikko: Vs: c++ map arvojen lisääminen
Kirjoitti: matsukan - 09.07.16 - klo:22.03

Virheilmoitus ?
Otsikko: Vs: c++ map arvojen lisääminen
Kirjoitti: hillo - 09.07.16 - klo:23.25
Default constructori puuttuu?
Koodia: [Valitse]
dp(){};
Otsikko: Vs: c++ map arvojen lisääminen
Kirjoitti: teele - 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?