错误:变量'..'有初始化程序但不完整的类型

时间:2014-03-15 18:33:29

标签: c++ templates incomplete-type

我的班级直方图:

typedef unsigned long int ulong;
typedef unsigned short int ushort;
typedef unsigned char ubyte;
typedef unsigned int uint;

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


class Histogram
{
    static const ushort NB_MAX = 256;
    uint histo[NB_MAX];
    uint grisMax;

public:

    Histogram(const GrayImage &gi);
    GrayImage* draw() const;
};

const ushort Histogram::NB_MAX;

/* END OF CLASS */

我的班级图片:

     #ifndef TP3_C___Image_h
#define TP3_C___Image_h


#include <iostream>
#include <cstdlib>
#include <sstream>
#include <stdexcept>
#include <vector>
#include <stdio.h>
#include <algorithm>

extern "C" {
#include <jpeglib.h> /* Ce sont des déclarations relatives à des fonctions C ! */
}

#include "Color.h"

#include <cmath>

typedef unsigned short int ushort;
typedef unsigned long int ulong;
typedef unsigned char ubyte;
typedef unsigned int uint;


template <typename T>
class Image
{
    friend class Histogram;

    /**
     * Longueur et largeur
     */
    ushort width, height;

    /**
     * Tableau d'images
     */
    T *array;


public:

    /**
     * Constructeur de la classe
     */
    Image(const ushort &w,const ushort &h);


    /**
     * Constructeur de copie
     */
    Image(const Image<T> &img);

    /**
     * Destructeur
     */
    ~Image();


/**
 * Méthode renvoyant une réference sur le pixel de
 * coordonnée x,y
 */
T &pixel(ushort, ushort);

/**
 * Méthode renvoyant le niveau de gris
 * correspondant au pixel de coordonée x,y
 */
const T& pixel(ushort x, ushort y) const;

/**
 * Retourne la largeur de l'image
 */
const ushort& getWidth() const;

/**
 * Retourne la hauteur de l'image
 */
const ushort& getHeight() const;

/**
 * Méthode initialisant les points de l'image
 */
void clear(T color = 0);

/**
 * Trace dans l'image un cadre rectangulaire (d'un pixel d'épaisseur) de la couleur color
 * dont le coin supérieur gauche est à la coordonnée (x,y) et dont la largeur et la hauteur
 * sont respectivement w et h.
 */
void rectangle(ushort x, ushort y, ushort w, ushort h, T color);

void line(ushort x0, ushort y0, ushort x1, ushort y1 , const Color couleur);

/**
 * Trace un rectangle plein sur le même principe que la précédante.
 */
void fillRectangle(ushort x, ushort y, ushort w, ushort h, T color);

/**
 *  Écrit à l'interieur du fichier PGM
 */
void writePGM(std::ostream&) const;

/**
 *  Écrit à l'interieur du fichier PPM
 */
void writePPM(std::ostream&) const;
void writeTGA(std::ostream&, bool rle = true) const;

/**
 *  Écrit à l'interieur du fichier JPEG
 */
void writeJPEG(const char*, unsigned int quality = 75) const;

Image<ubyte>* floydSteinberg() const;


/**
 *  Lit une image au format PGM
 */
static Image<ubyte>* readPGM(std::istream&);
static Image<Color>* readPPM(std::istream&);
static Image<Color>* readTGA(std::istream&);
static Image<Color>* readJPEG(char*);
Image<Color>* simpleScale(ushort, ushort) const;

Image<Color>* bilinearScale(ushort, ushort) const;
Image<ubyte>* threshold(ubyte thresh= 128) const;
Image<ubyte>* randomDither() const;};

 typedef Image<ubyte> GrayImage;
 typedef Image<Color> ColorImage;

这是主要的摘录:

     #include <iostream>
     #include <iomanip>
#include <fstream>
#include <memory>
#include <cmath>
#include "Image.h"
#include "Histogram.h"

using namespace std;

typedef Image<ubyte> GrayImage;
typedef Image<Color> ColorImage;


int main()
{
    try
    {
        //========================================
        // Pour créer un rectangle vide et plein
        //========================================

        GrayImage gi(200,400); /* Une image en gris */
        ofstream os("rectangle.pgm", ios::binary);
        gi.clear(100);
        gi.fillRectangle(0, 0, 2,2, 244);
        gi.rectangle(0, 52, 50, 100, 244);
        gi.writePGM(os);


        //=========================================================
        // Pour lire une image, écrire par dessus et l'enregistrer
        //=========================================================

        ifstream ifsPgm("chat.pgm", ios::binary);
        auto_ptr<GrayImage> ptrGray(GrayImage::readPGM(ifsPgm)); /* Une image en gris */
        ptrGray->fillRectangle(0, 0, 50,100, 222);
        ptrGray->rectangle(70, 70, 50, 100, 244);
        ofstream chatOutPut("chatWrite.pgm", ios::binary);
        ptrGray->writePGM(chatOutPut);


        //=================================================
        // Pour lire une image et déssiner son histogramme
        //=================================================

        ifstream ifsHisto("chat.pgm", ios::binary);
        ofstream histogramOutPut("histogram.pgm", ios::binary);
        ptrGray.reset(GrayImage::readPGM(ifsHisto)); 
        if(ptrGray.get()) {
            Histogram histo(*ptrGray);
            auto_ptr<GrayImage> myHisto(histo.draw());
            myHisto->writePGM(histogramOutPut);}

所以我收到了这个错误:

 error: variable ‘Histogram histo’ has initializer but incomplete type

我看到很多关于此类错误的帖子但没有... 有人知道问题可能来自哪里?

0 个答案:

没有答案