2016-12-19 4 views
0

Image.hНаследование и Пространства имен в C++

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

using namespace math; 

namespace imaging 
{ 
    class Image: public Array 
    { 
     public: 
      Image(); 
    }; 
} 

Array.h

namespace math 
{ 

    template <typename T> 
    class Array 
    { 
     protected: 
      T * buffer; 
      unsigned int width, height; 
     public: 
      Array(unsigned int w, unsigned int h); 
    }; 
} 

и Array.cpp

#include <iostream> 
using namespace std; 

namespace math 
{ 
    Array::Array(unsigned int w, unsigned int h) 
    { 
     this->width = w; 
     this->height = h; 
    } 
} 

У меня есть эти ошибки: Image.h: 12 : 2: ошибка: ожидаемое имя класса до { токен

{ 

^ В файле включены из Image.cpp: 1: 0: Image.h: 12: 2: ошибка: ожидается имя-класса, прежде чем { лексем

{ 

^ Array.cpp: 8: 2: ошибка: неверное использование имени шаблона math::Array без списка аргументов Array::Array(unsigned int w, unsigned int h)

Любая помощь для этого ??? Thnx

+1

Вы должны шаблон-Изе класс 'Image'. 'template class Image: public Array {}' – P0W

+0

Небольшой комментарий об именах: массив известен как базовый 1D-набор записей в C и C++. в C++ существует также 'std :: array', поэтому присвоение двумерного массива' Array' может быть в порядке в проблемной области, но запутанно в C++. – stefaanv

ответ

2

Вы должны поставить вас определение Array конструктора в заголовке, с правильным синтаксисом для шаблона:

namespace math 
{ 
    template<typename T> 
    Array::Array(unsigned int w, unsigned int h) 
    { 
     this->width = w; 
     this->height = h; 
    } 
} 

Важное правило заключается в том, что вы не должны не может определить функции для template классов в исходных файлах. (Вы можете в определенных обстоятельствах, но делать во внимание, что как исключение, а не правило.)

0

без <>, Array предполагается как класс нешаблонном, который является не тот случай, что приводит к ошибке.

У вас есть проблема здесь:

namespace imaging 
{ 
    class Image: public Array 

должно быть

namespace imaging 
{ 
    template <typename T> 
    class Image: public Array<T> 
+0

спасибо u очень много! поэтому для класса Image, как может видеть главная программа? используя typedefs ?? – chris

Смежные вопросы