2017-02-18 3 views
0

Я читаю Принципы и практика программирования с использованием C++, написанные Bjarne Stroustrup, и я застрял на странице 204, о constexpr, кажется, что я не могу сделать пример кода в книге компиляции:Как создать функции constexpr в C++

constexpr double xscale = 10; 
constexpr double yscale = 0.8; 
constexpr Point scalePoint(Point p) 
{ 
    return{ xscale * p.x, yscale * p.y }; 
} 

точка является классом с двумя членами, ху, и конструктор:

class Point 
{ 
    double x; 
    double y; 
    Point(double inX, double inY) 
     : x(inX),y(inY) 
    { 

    } 
}; 

ошибка я получаю это:

Error (active)  
function "scalePoint" (declared at line 13) was previously not declared constexpr 
+0

* Где * У вас есть ошибка? Не могли бы вы попытаться создать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) и показать нам, в том числе о том, как вы вызываете эту функцию. –

+2

Если вы возвращаете 'Point', вы также можете создать конструктор' constexpr'. –

+2

Ошибка заставляет это звучать так, как будто у вас есть прототип 'scalePoint' где-то вне кода, который вы отправили, который объявлен без' constexpr'. – Dolda2000

ответ

2

В качестве комментатора Бо указал правильно, вы должны также создать конструктор Point constexpr. Функции Constexpr могут вызывать только другие функции constexpr!

Кроме того, у вас есть только частные члены класса Point. Поэтому функция scalePoint() не может получить доступ к p.x, p.y и не может создать экземпляр Point в качестве возвращаемого значения, потому что конструктор является закрытым.

Сделать точки структуры или добавить "общественность:" заявление:

struct Point 
{ 
    double x; 
    double y; 
    constexpr Point(double inX, double inY) 
     : x(inX),y(inY) 
    { 

    } 
}; 

Это компилирует для меня.

+0

Поблагодарите вас за это. –

Смежные вопросы