Arhn - архитектура программирования

ошибка: невозможно связать ‘std::ostream в файле реализации

Во-первых: я попытался прочитать и изменить свой код, основываясь не менее чем на 7 других подобных вопросах. В лучшем случае другие варианты вызывают лавину ошибок. С моим текущим кодом я дошел до одной ошибки.

Помещение его внутри класса и использование «друга» не работает, а использование оператора ostream&‹‹ (ostream &out, const Fraction &rhs) приводит к гораздо большему количеству ошибок. Разочаровывает то, что в c9.io этот код работает, но не в Netbeans.

В моем main.cpp:

#include <iostream>
#include "fraction.h"
using namespace std;
int main() {
    Fraction f(3, 4);
    cout << f;   
    return 0;
}

В дроби.ч:

#ifndef FRACTION_H
#define FRACTION_H

class Fraction{
    public:
        //constructor defs            
        //accessors           
        //modifiers/mutators
        void setNumer(int newNum);
        void setDenom(int newDenom);
        void reduce();

    private:
        //instance variables
        int numer;
        int denom;
        //helper functions
        int gcd(int a, int b);
}; 
#endif /* FRACTION_H */

И во фракционном.cpp:

#include "fraction.h"
#include <cmath>
#include <iostream>
using namespace std;

//code for constructors

//accessors
int Fraction::getNumer(){
    return numer;
}

int Fraction::getDenom(){
    return denom;
}

//modifiers/mutators

//other operator definitions

ostream& operator<< (ostream &out, Fraction &rhs){
    if(rhs.getNumer() == 0){
        out << 0;
    } else if(rhs.getNumer() == rhs.getDenom()){
        out << 1;
    } else {
        rhs.reduce();
        out << rhs.getNumer() << "/" << rhs.getDenom();
    }
}

Результат:

g++    -c -g -std=c++11 -MMD -MP -MF "build/Debug/GNU-Linux/main.o.d" -o build/Debug/GNU-Linux/main.o main.cpp
main.cpp: In function ‘int main()’:
main.cpp:6:13: error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’
     cout << f;   
             ^
In file included from /usr/include/c++/4.8/iostream:39:0,
                 from main.cpp:1:
/usr/include/c++/4.8/ostream:602:5: error:   initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = Fraction]’
     operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x)
     ^

Ответы:


1

Нет сведений о функции operator<<, которая определена в Fraction.cpp в main.cpp Следовательно, строка

cout << f;

это проблема.

Добавьте объявление функции в файл .h.

#ifndef FRACTION_H
#define FRACTION_H

#include <iostream>

class Fraction{
    public:
        //constructor defs            
        //accessors           
        //modifiers/mutators
        void setNumer(int newNum);
        void setDenom(int newDenom);
        void reduce();

    private:
        //instance variables
        int numer;
        int denom;
        //helper functions
        int gcd(int a, int b);
}; 

std::ostream& operator<< (std::ostream &out, Fraction const& rhs);
//                                                    ^^^^ Using const&, not just Fraction&

#endif /* FRACTION
31.01.2016
  • Близко, но не сигара. Как я уже сказал, добавление const вызывает лавину дополнительных ошибок: g++ -c -g -std=c++11 -MMD -MP -MF "build/Debug/GNU-Linux/fraction.o.d" -o build/Debug/GNU-Linux/fraction.o fraction.cpp fraction.cpp: In function ‘std::ostream& operator<<(std::ostream&, const Fraction&)’: fraction.cpp:88:21: error: passing ‘const Fraction’ as ‘this’ argument of ‘int Fraction::getNumer()’ discards qualifiers [-fpermissive] if(rhs.getNumer() == 0){ ^ fraction.cpp:90:28: error: passing ‘const Fraction’ as ‘this’ argument of ‘int Fraction::getNumer()’ di 31.01.2016
  • @SkippOtter, убедитесь, что getNumer() и getDenom() являются const функциями-членами. 31.01.2016
  • две проблемы: добавление ключевого слова const как к объявлению в function.h, так и к определению в function.cpp ничего не делает, ошибка остается прежней. И у меня есть геттеры и сеттеры для numer и denom, так что они не могут быть константами, верно? 31.01.2016
  • Хотя я не понимаю, зачем мне нужны сеттеры, чтобы я мог избавиться от этого. 31.01.2016

  • 2

    Таким образом, ответ был частично тем, что сказал @r-sahu: мне пришлось установить getNumer() и getDenom() как функции-члены const, НО я мог избавиться от ошибок, только НЕ используя const& в определении функции.

    Хорошо:

    std::ostream& operator<< (std::ostream &out, Fraction rhs);

    Фигово:

    std::ostream& operator<< (std::ostream &out, Fraction const& rhs);

    Теперь он компилируется и запускается. Любое понимание того, почему создание функций-членов const, но не передача Fraction as const заставляет его работать? Я случайно наткнулся на это решение и не понимаю его.

    31.01.2016
  • Вероятно, вы вызывали неконстантные функции-члены, такие как gcd, внутри operator<<. Правильный подход — сохранить std::ostream& operator<< (std::ostream &out, Fraction const& rhs); и исправить эти вещи. 31.01.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..