Ошибка компоновщика C ++ при перегрузке iostream - PullRequest
0 голосов
/ 12 октября 2010

я получаю 2 ошибки компоновщика при попытке скомпилировать мою программу, которая включает эти два файла (вызывая проблему, в частности строки, выделенные жирным шрифтом)

и я новичок в C ++извините за невежествоZ)

1> Assignment1.obj: ошибка LNK2001: неразрешенный внешний символ "class std :: basic_ostream> & оператор __cdecl << (класс std :: basic_ostream> &, класс Point)" (?? 6 @YAAAV? $ Basic_ostream @ DU? $ Char_traits @ D @ std @@@ std @@ AAV01 @ VPoint @@@ Z) * ​​1009 *

1> c: ...... \ visual studio 2010 \ Projects \Assignment1 \ Release \ Assignment1.exe: фатальная ошибка LNK1120: 2 неразрешенных внешних файла

файл point.h:

#ifndef SS_Point_H
#define SS_Point_H

#include "common.h"

//==================================================================
//  Point Class Definition
//==================================================================

class Point {
friend class Vector;
protected:
 int dimn;            // # coords (1, 2, or 3 max here)
 Error err;           // error indicator
public:
 double x, y, z;      // z=0 for 2D, y=z=0 for 1D

 //----------------------------------------------------------
 // Lots of Constructors (add more as needed)
 Point() { dimn=3; x=y=z=0; err=Enot; }
 // 1D Point
 Point( int a) {
  dimn=1; x=a; y=z=0; err=Enot; }
 Point( double a) {
  dimn=1; x=a; y=z=0; err=Enot; }
 // 2D Point
 Point( int a, int b) {
  dimn=2; x=a; y=b; z=0; err=Enot; }
 Point( double a, double b) {
  dimn=2; x=a; y=b; z=0; err=Enot; }
 // 3D Point
 Point( int a, int b, int c) {
  dimn=3; x=a; y=b; z=c; err=Enot; }
 Point( double a, double b, double c) {
  dimn=3; x=a; y=b; z=c; err=Enot; }
 // n-dim Point
 Point( int n, int a[]);
 Point( int n, double a[]);
 // Destructor
 ~Point() {};

 //----------------------------------------------------------
 // Input/Output streams
 **friend std::istream& operator>> ( std::istream&, Point&);
 friend std::ostream& operator<< ( std::ostream&, Point );**

....}

пока файл point.c:

#include "point.h"
#include "vector.h"
#include <iostream.h>
//==================================================================
// Point Class Methods
//==================================================================

//------------------------------------------------------------------
// Constructors (add more as needed)
//------------------------------------------------------------------

// n-dim Point
Point::Point( int n, int a[]) {
 x = y = z = 0;
 err = Enot;
 switch (dimn = n) {
 case 3: z = a[2];
 case 2: y = a[1];
 case 1: x = a[0];
  break;
 default:
  err=Edim;
 }
}

Point::Point( int n, double a[]) {
 x = y = z = 0.0;
 err = Enot;
 switch (dimn = n) {
 case 3: z = a[2];
 case 2: y = a[1];
 case 1: x = a[0];
  break;
 default:
  err=Edim;
 }
}

//------------------------------------------------------------------
// IO streams
//------------------------------------------------------------------

// Read input Point format: "(%f)", "(%f, %f)", or "(%f, %f, %f)"


**std::istream& operator>>( std::istream& input, Point& P) {**
     char c;
     input >> c;                // skip '('
     input >> P.x;
     input >> c;                
     if (c == ')') {
      P.setdim(1);       // 1D coord
      return input;
     }
     // else                    // skip ','
     input >> P.y;
     input >> c;
     if (c == ')') {
      P.setdim(2);       // 2D coord
      return input;
     }
     // else                    // skip ','
     input >> P.z;
     P.setdim(3);               // 3D coord
     input >> c;                // skip ')'
     return input;
    }

// Write output Point in format: "(%f)", "(%f, %f)", or "(%f, %f, %f)"
**std::ostream& operator<<( std::ostream& output, Point P) {**
 switch (P.dim()) {
 case 1:
  output << "(" << P.x << ")";
  break;
 case 2:
  output << "(" << P.x << ", " << P.y << ")";
  break;
 case 3:
  output << "(" << P.x << ", " << P.y << ", " << P.z << ")";
  break;
 default:
  output << "Error: P.dim = " << P.dim();
 }
 return output;
}

..... ..... .....}

Ответы [ 3 ]

2 голосов
/ 12 октября 2010

Трудно по информации, приведенной, чтобы увидеть проблему; у вас есть код C ++ в .c файле, но, вероятно, ваш компилятор жаловался бы, если бы у вас его не было, чтобы это распознать. Чтобы избежать сомнений, переименуйте ваш point.c файл point.cpp.

Как правило, хорошей идеей является использование предварительных объявлений о вещах, которые вы хотите дружить; это гарантирует, что вы поддерживаете некоторую функцию верхнего уровня, а не какую-то внутреннюю функцию (особенно в отношении классов друзей).

// forward declarations
class Point;
std::istream& operator>> ( std::istream&, Point&);
std::ostream& operator<< ( std::ostream&, Point );

// point class
class Point {
   ...
   friend std::istream& operator>> ( std::istream&, Point&);
   friend std::ostream& operator<< ( std::ostream&, Point );
   ...
0 голосов
/ 12 октября 2010

Первая ошибка - жалоба на отсутствие определения класса Vector, которое вы используете в качестве друга, а не vector, которое вы включили в .cpp Не в заглавную букву. Вы намеревались использовать разные классы?

0 голосов
/ 12 октября 2010
#include <iostream>

Нет .h.

У вас есть ошибка в вашем векторном классе в том, что оператор "^" не определен. Также по причинам приоритета действительно лучше не использовать такие вещи, как ^ для операции. Среди прочего его действительно не очевидно, что это ...

Я не совсем уверен в вашей проблеме ostream, хотя ...

...