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

これはランダムな値を返します (また、デバッグ出力 "created..." ではありません)。eg によって返される値x()は明らかに「未定義」です。

g++ hereで同じことを試したところ、期待される結果が得られました。これは問題clang++ですか、それとも私のコードにバグがありますか?

私のclangバージョン: Ubuntu clang version 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 に答える