模板化类中的构造函数继承(C ++ 11)

时间:2013-08-31 20:51:42

标签: templates inheritance c++11 constructor clang++

我有以下类定义:

template<typename T>
class Point {
  private:
    T px, py;
  public:
    Point(T x, T y): px(x), py(y) {
      std::cout << "created " << x << ":" << y <<std::endl;
    };
    T x() const { return px; };
    T y() const { return py; };
};

我从中获得专业化,例如

class PointScreen: public Point<int> {
  using Point::Point;
};

当我在clang++中编译它时,我没有得到任何警告/错误,但是没有调用构造函数:

#include <iostream>
// definitions from above      
int main() {
  std::cout << PointScreen(100, 100).x() << std::endl;
  return 0;
}

这将返回一个随机值(也不是调试输出“created ...”)。例如,返回的值x()显然是“未定义的”。

我刚刚在g++ here尝试了相同的操作,并在那里获得了预期的结果。这是clang++的问题还是我的代码中有错误?

我的铿锵版:Ubuntu clang版本3.0-6ubuntu3(标签/ RELEASE_30 / final)(基于LLVM 3.0)。我用-std=c++11 -Wall编译。

1 个答案:

答案 0 :(得分:1)

正如评论中所指出的,您需要一个支持继承构造函数的编译器。从Apache C++11 overview您可以看到此功能仅适用于gcc&gt; = 4.8和Clang&gt; = 3.3。

对于较旧的编译器,您必须按calling the base constructors手动定义所有构造函数。有关解决方法的更多详细信息,另请参阅this Q&A