【发布时间】:2013-09-04 08:27:19
【问题描述】:
我有以下类定义:
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++ 的问题还是我的代码中有错误?
我的 clang 版本:Ubuntu clang 版本 3.0-6ubuntu3 (tags/RELEASE_30/final)(基于 LLVM 3.0)。我用-std=c++11 -Wall编译。
【问题讨论】:
-
适用于 clang++3.4。 Live example
-
继承ctors已经实现in clang 3.3。
-
有没有办法让这段代码在 clang 3.0 中工作?
-
template < typename... Args > PointScreen(Args&&... args) : Point(std::forward<Args>(args)...) {}用作可以调用基类的所有 ctor 的构造函数(使用 clang++3.0 进行了尝试)。无论哪种方式,您都需要将public放入PointScreen。 -
该模板 ctor 并没有采用通过 braced-init-list 隐式引入的
initializer_list(因为它的类型没有被推断出来)。如果使用该模板 ctor 解决方法,您需要单独的 ctor 用于初始化列表。
标签: templates inheritance c++11 constructor clang++