4

我有以下类定义:

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;
}

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

我刚刚在g++ 这里尝试了同样的方法,在那里我得到了预期的结果。这是clang++我的代码中的问题还是我的错误?

我的 clang 版本:Ubuntu clang 版本 3.0-6ubuntu3(tags/RELEASE_30/final)(基于 LLVM 3.0)。我用-std=c++11 -Wall.

4

1 回答 1

1

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

对于较旧的编译器,您必须通过调用基本构造函数来手动定义所有构造函数。有关变通方法的更多详细信息,另请参阅此 Q&A 。

于 2013-09-01T19:41:34.640 回答