【问题标题】:C++ how call template's class constructorC++如何调用模板的类构造函数
【发布时间】:2013-02-01 17:05:49
【问题描述】:

我有这样一段代码:

template <class T>
struct Rgb
{
    T *r, *g, *b;

    Rgb(int nr, int ng, int nb)
    {
        r = new T(nr);
        g = new T(ng);
        b = new T(nb);
    }

    Rgb(int n)
    {
        Rgb(n, n, n);
    }

    ~Rgb()
    {
        delete r;
        delete g;
        delete b;
    }
};

我已经这样做了,因为我希望能够创建像这样的对象:

    Rgb<std::vector<int>> a(10); // so it creates 3 vectors inside,
        // each with 10 elements or

    Rgb<std::deque<double>> a(2, 5, 4); // so it creates 3 deques inside
        // with different sizes

但是我上面给出的实现不起作用。请帮助我...谢谢...

【问题讨论】:

标签: c++ templates


【解决方案1】:

如果您的编译器支持 constructor delegation(例如 Clang 3.2 支持),您可以执行以下操作:

    Rgb(int n) : Rgb(n, n, n)
    {
    }

您正在做的是在构造函数中构造一个临时 Rgb 实例,一旦未初始化的 rgb 被删除,该实例将失败。

否则我建议要么创建一个通用的init 函数来执行初始化,要么简单地复制代码。正如 cmets 所指出的,您不应该在此处使用 new(这几乎总是现代 C++ 代码中的代码味道)。把这些放在一起:

template <class T>
struct Rgb
{
    T r, g, b;

    Rgb(int nr, int ng, int nb) : r(nr), g(ng), b(nb)
    { }

    Rgb(int n) : r(n), g(n), b(n)
    { }

    ~Rgb()
    { }
};

【讨论】:

  • VC11 支持构造函数委托,如果你安装了Nov 2012 CTP
  • 谢谢))这解决了我的问题))我什至不知道 VC11 的 NOV CTP))
猜你喜欢
  • 2017-09-12
  • 2020-09-10
  • 2011-09-15
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 2013-04-21
相关资源
最近更新 更多