我有以下类定义:
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
编译。
答案 0 :(得分:1)
正如评论中所指出的,您需要一个支持继承构造函数的编译器。从Apache C++11 overview您可以看到此功能仅适用于gcc&gt; = 4.8和Clang&gt; = 3.3。
对于较旧的编译器,您必须按calling the base constructors手动定义所有构造函数。有关解决方法的更多详细信息,另请参阅this Q&A。