2013-09-02 5 views
-1

Как вызвать конструктор шаблона с объектами другого класса?Создание объекта шаблона C++

Пример:

#include <iostream> 
using namespace std; 

class RGB{ 
    private: 
    int _R; 
    int _G; 
    int _B; 

    public: 
     RGB(int a, int b, int c){ 
     _R=a; 
     _G=b; 
     _B=c; 
    } 
}; 

class Gray{ 
    int _G; 
    public: 
    Gray(int x){ 
     _G=x; 
    } 
}; 

template <class T1, class T2> 
class Pixel{ 
    public: 

    Pixel(T1 i, T2 j, int a, int b){ 
     foo=i; 
     bar=j; 
     x=a; 
     y=b; 
    } 

    void setPixel(T1 a, T2 b){ 
     foo=a; 
     bar=b; 
    } 

    void getPixel(); 

    private: 
     int x; 
     int y; 
     T1 foo; 
     T2 bar; 

}; 


int main(){ 

    Gray g(3); 
    RGB rgb(4, 5, 6); 
    Pixel<Gray,RGB> pi(g, rgb, 10,27); 


    return 0; 
} 

Я могу использовать конструктор класса только с конструкторами по умолчанию двух классов планкой1 и BAR2, но не с двумя объектами классов, которые я создал ранее (в этом case bar1 и bar2).

Ошибки:

main.cpp: In instantiation of 'Pixel::Pixel(T1, T2, int, int) [with T1 = Gray; T2 = RGB]': 
main.cpp:62:37: required from here 
main.cpp:35:37: error: no matching function for call to 'Gray::Gray()' 
main.cpp:35:37: note: candidates are: 
main.cpp:26:5: note: Gray::Gray(int) 
main.cpp:26:5: note: candidate expects 1 argument, 0 provided 
main.cpp:23:7: note: Gray::Gray(const Gray&) 
main.cpp:23:7: note: candidate expects 1 argument, 0 provided 
main.cpp:35:37: error: no matching function for call to 'RGB::RGB()' 
main.cpp:35:37: note: candidates are: 
main.cpp:16:9: note: RGB::RGB(int, int, int) 
main.cpp:16:9: note: candidate expects 3 arguments, 0 provided 
main.cpp:9:7: note: RGB::RGB(const RGB&) 
main.cpp:9:7: note: candidate expects 1 argument, 0 provided 

Ошибки уходят, если добавить значения по умолчанию в конструкторах RGB и Грея. Извините за беспорядок, я здесь новый ...

+3

Вы получаете ошибку «неполного типа»? Я не могу следовать вашим объяснениям. –

+1

Ваш конструктор, вероятно, должен быть «public», но кроме этого, если вы даете определения ctor и двух классов «Bar1» и «Bar2», ваш код работает нормально. [Живой пример] (http://coliru.stacked-crooked.com/a/c887bf512118a71c) – dyp

+0

Вы передаете копии bar1 и bar2 в конструктор Foo. Что не работает? Что вы ожидаете от этого? Можете ли вы построить пример, который показывает, что вы хотите сделать? –

ответ

6

Вы должны узнать о initialization lists:

Pixel(T1 i, T2 j, int a, int b) : x(a), y(b), foo(i), bar(j) { 
} 

foo=i; и т.д. в теле Pixel конструктора назначения к уже существующий объект. Когда вы вызываете конструктор Pixel, он пытается вызвать конструктор по умолчанию для своих подобъектов, Gray и RGB, однако оба этих типа не имеют конструкторов по умолчанию, сгенерированных с тех пор, как вы предоставляете определяемый пользователем конструктор. Решение состоит в том, чтобы использовать списки инициализации в для инициализации подобъектов в вашем классе Pixel.

Также обратите внимание, что подобъекты класса построены в том порядке, в котором они объявлены внутри определения класса, поэтому вы всегда должны инициализировать их в том же порядке, в каком они объявлены в списке инициализации конструктора.

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