当前位置 : 主页 > 手机开发 > 其它 >

templates – 模板化类中的构造方法继承(C 11)

来源:互联网 收集:自由互联 发布时间:2021-06-19
我有以下类定义: templatetypename Tclass 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; };}; 我从中获得专业化
我有以下类定义:

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编译.

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

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

网友评论