У меня есть следующее определение класса:
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;
}
Это возвращает случайное значение (а также не вывод отладки «создано...»). Значение, возвращаемое, например. x()
явно "не определено".
Я только что попробовал то же самое в g++
здесь и получил ожидаемый результат. Это проблема с clang++
или это ошибка в моем коде?
Моя версия clang: Ubuntu clang версии 3.0-6ubuntu3 (tags/RELEASE_30/final) (на основе LLVM 3.0). Я компилирую с -std=c++11 -Wall
.
template < typename... Args > PointScreen(Args&&... args) : Point(std::forward<Args>(args)...) {}
работает как конструктор, который может вызывать все ctors базового класса (пробовали с clang++3.0). В любом случае вам нужно поставить make itpublic
вPointScreen
. - person dyp   schedule 01.09.2013initializer_list
, неявно введенный через braced-init-list (поскольку его тип не выводится). Вам понадобятся отдельные ctors для списков инициализаторов, если вы используете обходной путь ctor шаблона. - person dyp   schedule 01.09.2013