创建模板对象C ++

时间:2013-09-02 21:27:21

标签: 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;
}

我只能使用类的构造函数和两个类Bar1和Bar2的默认构造函数,但不能使用我之前创建的类的两个对象(在本例中为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和灰色构造函数中,错误就会消失。 抱歉这个烂摊子,我是新来的......

1 个答案:

答案 0 :(得分:6)

您需要了解initialization lists

Pixel(T1 i, T2 j, int a, int b) : x(a), y(b), foo(i), bar(j) {
}
foo=i;构造函数正文中的

Pixel分配给已存在的对象。调用Pixel构造函数时,它会调用其子对象GrayRGB的默认构造函数,但是,这两种类型都没有生成默认构造函数,因为您提供了一个用户 - 定义的构造函数。解决方案是使用初始化列表初始化 Pixel类中的子对象。

另外,请注意,类的子对象是按照它们在类定义中声明的顺序构造的,因此您应该始终按照它们在构造函数初始化列表中声明的顺序对它们进行初始化。