У меня есть класс Dimension
, который я определил (как и все мои классы) в файле Dimension.h:Можно ли объявить класс constexpr в заголовке и определить его в отдельном файле .cpp?
class Dimension
{
public:
constexpr Dimension() noexcept;
constexpr Dimension(int w, int h) noexcept;
int width;
int height;
};
Я думал, что я мог бы, как и во всех моих классах, поместить определение в отдельном Dimension.cpp :
#include "Dimension.h"
constexpr Dimension::Dimension() noexcept : width(0), height(0) {}
constexpr Dimension::Dimension(int w, int h) noexcept : width(w), height(h) {}
но когда я пытаюсь использовать класс, компилятор говорит мне:
предупреждение: встроенная функция «constexpr Dimension::Dimension()
» используется, но не определен
и в то время как связь:
неопределенная ссылка на 'pong::graphics::Dimension::Dimension()
'
(то же самое с другой конструктор)
Если я определить класс в заголовке следующим образом:
class Dimension
{
public:
constexpr Dimension() noexcept : width(0), height(0) {}
constexpr Dimension(int w, int h) noexcept : width(w), height(h) {}
int width;
int height;
};
и опустить файл .cpp, все работает нормально.
Я использую GCC 4.9.2. Почему отдельное определение не работает?
Весь смысл функции 'constexpr' - это позволить оценить функцию во время компиляции.Что было бы довольно сложно снять, если компилятор не может видеть тело указанной функции. –
_ «Почему отдельное определение не работает?» _ - Потому что язык этого не позволяет. Примите это, сделайте это правильно, двигайтесь дальше. –
Я уже подозревал, что, но я не совсем уверен, могу ли я объяснить (возможно, с рекомендациями), почему это происходит именно так. Я ничего не нашел об этом во время поиска в Google, поэтому я решил, что новый вопрос для этого был уместным. –