我有以下类定义: 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.