maniacbug / StandardCplusplus

Standard C++ for Arduino (port of uClibc++)
588 stars 182 forks source link

Issue with compilation Arduino Leonardo #4

Closed michaelachrisco closed 9 years ago

michaelachrisco commented 11 years ago

I get an error compiling the example program serstream:

serstream.ino:11:29: error: no matching function for call to ‘std::basic_oserialstream::basicoserialstream(Serial&)’ serstream.ino:11:29: note: candidates are: In file included from serstream.ino:2:0: /home/mike/arduino/libraries/StandardCplusplus/serstream:230:12: note: std::basic_oserialstream<charT, traits, Tserial>::basic_oserialstream(Tserial&) [with charT = char; traits = std::chartraits; Tserial = HardwareSerial] /home/mike/arduino/libraries/StandardCplusplus/serstream:230:12: note: no known conversion for argument 1 from ‘Serial’ to ‘HardwareSerial&’ /home/mike/arduino/libraries/StandardCplusplus/serstream:213:60: note: std::basic_oserialstream::basic_oserialstream(const std::basicoserialstream&) /home/mike/arduino/libraries/StandardCplusplus/serstream:213:60: note: no known conversion for argument 1 from ‘Serial’ to ‘const std::basic_oserialstream&’

anvo commented 10 years ago

The problem is: for some boards, Serial is not defined as HardwareSerial, but instead as Serial_.

HardwareSerial.h, line 97:

#if defined(UBRRH) || defined(UBRR0H)
  extern HardwareSerial Serial;
#elif defined(USBCON)
  #include "USBAPI.h"
//  extern HardwareSerial Serial_;  
#endif

USBAPI.h, line 25:

//================================================================================
//================================================================================
//  Serial over CDC (Serial1 is the physical port)

class Serial_ : public Stream
{
private:
    ring_buffer *_cdc_rx_buffer;
public:
    void begin(uint16_t baud_count);
    void end(void);

    virtual int available(void);
    virtual void accept(void);
    virtual int peek(void);
    virtual int read(void);
    virtual void flush(void);
    virtual size_t write(uint8_t);
    using Print::write; // pull in write(str) and write(buf, size) from Print
    operator bool();
};
extern Serial_ Serial;

A quick solution would be to declare your own cout using basic_oserialstream.

#include <StandardCplusplus.h>
#include <serstream>
#include <avr/pgmspace.h>

std::basic_oserialstream<char, std::char_traits<char>, Serial_> cout(Serial);

void setup(void)
{
  Serial.begin(57600); 
}

void loop()
{
  cout << "Hello, world." << std::endl;  
  delay(1000);
}