C ++ включая <complex>вызывает синтаксическую ошибку в строке файла - PullRequest
0 голосов
/ 22 августа 2011

Ошибка 3: ошибка C2059: синтаксическая ошибка: ')' c: \ program files \ microsoft visual studio 10.0 \ vc \ include \ string 758 1 ECE572_001_Project1_swirl Ошибка 6: ошибка C2059: синтаксическая ошибка: ')' c: \программные файлы \ microsoft visual studio 10.0 \ vc \ include \ string 767 1 ECE572_001_Project1_swirl Ошибка 1 ошибка C2143: синтаксическая ошибка: отсутствует ')' перед 'строкой' c: \ программные файлы \ microsoft visual studio 10.0 \ vc \ include \ string 758 1ECE572_001_Project1_swirl Ошибка 4 ошибка C2143: синтаксическая ошибка: отсутствует «)» перед «строкой» c: \ program files \ microsoft visual studio 10.0 \ vc \ include \ string 767 1 Ошибка ECE572_001_Project1_swirl Ошибка 2 C2665: «swprintf»: ни одна из двух перегрузокможет преобразовать все типы аргументов c: \ program files \ microsoft visual studio 10.0 \ vc \ include \ string 758 1 ECE572_001_Project1_swirl Ошибка 5 ошибка C2665: 'swprintf': ни одна из двух перегрузок не может преобразовать все типы аргументов c: \ программные файлы\ microsoft visual studio 10.0 \ vc \ include \ string 767 1 ECE572_001_Project1_swirl

Я не понимаю эту ошибку, потому что она говорит, что ошибка находится в строке файла, которая является заблокированным файлом, предоставленным VS2010.Во-вторых, я даже не использую строку, и в-третьих, как в том числе комплекс может иметь какое-либо отношение к строке библиотеки?

Несмотря на то, что включение сложных причин приводит к ошибке в файле моего проекта, я запустил совершенно новый файлчтобы проверить включение, и ошибки там не было.

#include "Image.h"
#include <iostream>
#include <complex>

using namespace std;

#define Usage "makeSwirl inImg outImg coeff\n"

/*
 * arg1 is the image to transform.
 * arg2 is the swirl coefficient
 * Returns image with enhanced edges.
 */
Image swirl(const Image&, const float&);
/*
 * arg1 is the image within which the pixel to be transformed is located.
 * arg2&3&4 are the row, colum, and channel of the pixel to transform.
 * arg5 is the swirl coefficient
 * arg6&7 are the rows and cols of arg1.
 * returns transformed pixel.
 */
float onePixelSwirl(const Image&, const int&, const int&, const int&, const double&, const int&, const int&);

int main(int argc, char **argv)
{
    // Check for proper number of arguments.
    if(argc != 4)
    {
        cout << Usage;
        exit(3);
    }

    // Read in image specified by user.
    const Image IN_IMG = readImage(argv[1]);

    // Create output image with oil effect.
    Image outImg = swirl(IN_IMG, atof(argv[3]));

    // Output the image
    writeImage(outImg, argv[2]);

    // Success!
    return(0);
}

Image swirl(const Image& IN_IMG, const float& COEFF)
{
    Image outImg;

    // Allocate memory
    const int ROWS = IN_IMG.getRow();
    const int COLS = IN_IMG.getCol();
    const int CHANNELS = IN_IMG.getChannel();
    outImg.createImage(ROWS, COLS, IN_IMG.getType());

    // Perform edge effect
    for (int k = 0; k < CHANNELS; ++k)
        for (int i = 0; i < ROWS; ++i)
            for (int j = 0; j < COLS; ++j)
                outImg(i,j,k) = onePixelSwirl(IN_IMG, i, j, k, COEFF, ROWS, COLS);

    return outImg;
}

float onePixelSwirl(const Image& IN_IMG, const int& ROW, const int& COL, 
    const int& CHANNEL, const double& COEFF, const int& ROWS, const int& COLS)
{
    // define shift of origin
    //const double X_SHIFT = ROWS/2.0;
    //const double Y_SHIFT = COLS/2.0;
    //const complex<double> NEW_SHIFTED(ROW - X_SHIFT, COL - Y_SHIFT);


    //const double r = abs(NEW_SHIFTED);
    //const complex<double> OLD_SHIFTED = polar(r, arg(NEW_SHIFTED) + r/COEFF);
    //const int OLD_ROW = OLD_SHIFTED.real() <= ROWS ? OLD_SHIFTED.real() : ROWS;
    //const int OLD_COL = OLD_SHIFTED.imag() <= COLS ? OLD_SHIFTED.imag() : COLS;

    //return IN_IMG(OLD_ROW, OLD_COL, CHANNEL);
    return 0;
}

Я поместил приведенный выше оператор include, включая image.h, и ошибки компиляции исчезли.Вот image.h, если кто-то может выяснить проблему:

/********************************************************************
 * Image.h - header file of the Image library which defines 
 *           a new class "Image" and the associated member functions
 *
 * Author: Hairong Qi, hqi@utk.edu, ECE, University of Tennessee
 *
 * Created: 02/05/02
 *
 * Note: 
 *   This is a simple C++ library for image processing. 
 *   The purpose is not high performance, but to show how 
 *   the algorithm works through programming.
 *   This library can only read in PGM/PPM format images. 
 *
 * Modification:
 *   07/31/09 - moving header files for colorProcessing, imageIO, and
 *               matrixProcessing to this file
 *   01/22/06 - reorganize the Image library such that the Image class
 *              only contains member functions related to the most 
 *              fundamental image operation
 *   11/12/05 - add wavelet transform function
 *   09/26/05 - add Fourier transform related functions
 *   09/07/05 - add overloading function for "/"
 *   09/07/05 - modify createImage() function
 *   09/07/05 - fix problems with copy constructor
 *   08/07/05 - regrouping functions
 ********************************************************************/

#ifndef IMAGE_H
#define IMAGE_H

#include <iostream>
#include <cmath>

using namespace std;

#define PGMRAW   1                     // magic number is 'P5'
#define PPMRAW   2                     // magic number is 'P6'
#define PGMASCII 3                     // magic number is 'P2'
#define PPMASCII 4                     // magic number is 'P3'
#define GRAY     10                    // gray-level image
#define BINARY   11                    // binary image

#define NBIT 8         
#define L ( pow(2.0,NBIT)-1 )    // the largest intensity represented by NBIT

class Image {
  friend ostream & operator<<(ostream &, Image &);
  friend Image operator/(Image &, double);    // image divided by a scalar
  friend Image operator*(Image &, double);    // image multiplied by a scalar
  friend Image operator+(Image &, double);    // image add a scalar
  friend Image operator-(Image &, double);    // image subtract a scalar

 public:
  // constructors and destructor
  Image();                             // default constructor 
  Image(int,                           // constructor with row
        int,                           // column
        int t=PGMRAW);                 // type (use PGMRAW, PPMRAW, 
                                       // PGMASCII, PPMASCII)
  Image(const Image &);                // copy constructor 
  ~Image();                            // destructor 

  // create an image
  void createImage();                  // create an image, parameters all set
  void createImage(int,                // create an image with row
           int c=1,            // column (default 1, a column vector)
           int t=PGMRAW);      // and type, default is PGMRAW
  void initImage(float init=0.0);      // initiate the pixel value of an img
                                       // the default is 0.0

  // get and set functions
  int getRow() const;                  // get row # / the height of the img 
  int getCol() const;                  // get col # / the width of the image 
  int getChannel() const;              // get channel number of the image
  int getType() const;                 // get the image type 
  float getMaximum() const;            // get the maximum pixel value
  void getMaximum(float &,             // return the maximum pixel value
          int &, int &);       // and its indices
  float getMinimum() const;            // get the mininum pixel value
  void getMinimum(float &,             // return the minimum pixel value
          int &, int &);       // and its indices
  Image getRed() const;                // get the red channel
  Image getGreen() const;              // get the green channel
  Image getBlue() const;               // get the blue channel
  Image getImage(int) const;           // get the kth channel image, 
                                       // k starts at 0

  void setRow(int);                    // set row number 
  void setCol(int);                    // set column number 
  void setChannel(int);                // set the number of channel
  void setType(int t=PGMRAW);          // set the image type
  void setRed(Image &);                // set the red channel
  void setGreen(Image &);              // set the green channel
  void setBlue(Image &);               // set the blue channel
  void setImage(Image &, int);         // set the kth channel image,
                                       // k starts at 0

  // operator overloading functions
  float & operator()(int,                  // operator overloading (i,j,k)
             int c = 0,            // when c=k=0, a column vector 
             int k = 0) const;     
  const Image operator=(const Image &);    // = operator overloading
  Image operator+(const Image &) const;    // overloading + operator
  Image operator-(const Image &) const;    // overloading - operator
  Image operator*(const Image &) const;    // overloading pixelwise *
  Image operator/(const Image &) const;    // overloading pixelwise division
  Image operator->*(const Image &) const;  // overloading ->* operator 
                                           // (matrix multiplication) 

  bool IsEmpty() const { return (image==NULL); }

 private:
  int row;                  // number of rows / height 
  int col;                  // number of columns / width 
  int channel;              // nr of channels (1 for gray, 3 for color)
  int type;                 // image type (PGM, PPM, etc.)
  int maximum;              // the maximum pixel value
  float *image;             // image buffer
};


////////////////////////////////////
// image I/O
Image readImage(char *);             // read image
void writeImage(Image &,             // write an image
                char *,
                int flag=0);         // flag for rescale, rescale when == 1
Image rescale(Image &,               // rescale an image
              float a=0.0,           // lower bound
              float b=L);            // upper bound


////////////////////////////////////
// color processing routines
Image RGB2HSI(Image &);              // convert from RGB to HSI model
Image HSI2RGB(Image &);              // convert from HSI to RGB model


////////////////////////////////////
// matrix manipulation
Image transpose(Image &);            // image transpose
Image inverse(Image &);              // image inverse
Image pinv(Image &);                 // image pseudo-inverse
Image subImage(Image &,              // crop an image
               int,                  // starting row index
               int,                  // starting column index
               int,                  // ending row index
               int);                 // ending column index


#endif

1 Ответ

0 голосов
/ 22 августа 2011

Есть ряд вещей, которые подозрительны, но главное - это определение L. Насколько я помню, L используется для обозначения строкового литерала Unicode, как в L"Some Unicode text". Кажется вероятным, что <complex> использует это. Включив Image.h перед <complex>, вы изменили его. Это также объясняет прерванные вызовы swprintf().

Поскольку вы не используете L в Image.h, есть ли причина объявить это там? Если L является частью интерфейса и фактически должен находиться в заголовочном файле, рассмотрите возможность переименования его во что-то менее вероятное, чтобы вызвать конфликт имен.

Другие вещи, которые выглядят подозрительно, но не обязательно являются проблемой: Вы включили <cmath> в Image.h без видимой причины. Как правило, вы должны включать только те файлы, которые вам действительно нужны. Большая проблема - using namespace std в шапке. Это почти всегда плохая идея, поскольку каждое имя в пространстве имен std помещается в локальную область действия каждого файла, который включает этот заголовочный файл. Это значительно увеличивает вероятность столкновения имен, которое может быть сложно разобрать (как вы можете видеть)

...