У меня возникли проблемы с разбиением constexpr
между заголовком и файлом .ipp.Я взял пример из здесь (глядя на слайд 29, класс str_const
), но попытался разделить его между .hpp и .ipp файлом для более чистого заголовка.
Заголовок:
#pragma once
namespace Example
{
class ErrCode
{
public:
template <std::size_t N>
constexpr ErrCode (const int aCode, const char (& aMsg) [N]); //ctor
constexpr ErrCode (const ErrCode & aErrCode) = default; //copy
ErrCode & operator= (const ErrCode & aErrCode) = default; //operator=
constexpr char operator[] (std::size_t aSize);
//... a few other methods, all constexpr except return the string
const int id;
private:
const char * const mStrPtr;
const std::size_t mSize;
}
}
#include "ErrCode.ipp"
ipp:
namespace Example
{
template <std::size_t N>
constexpr ErrCode::ErrCode (const int aCode, const char (& aMsg) [N] :
id (aCode),
mStrPtr (aMsg),
mSize (N - 1)
{
}
constexpr char ErrCode::operator[] (std::size_t aSize)
{
if (aSize < mSize)
{
return mStrPtr [aSize];
}
else
{
throw std::out_of_range ("");
}
}
}
У меня проблема с компилятором, который не устанавливает соединение между сигнатурами в .hpp и.ipp.По какой-то причине, когда я компилирую на VS 2017 (используя набор инструментов v140 или 2015), я получаю сообщение об ошибке перегруженной функции-члена, не найденной в классе.
error C2511: 'char Example::ErrCode::operator [](std::size_t)': overloaded member function not found in Example::ErrCode"
, где ошибка указывает на строку в .ipp, где происходит определение.
Разрешено ли мне разбивать эти методы constexpr на отдельный файл?Компилятор не имеет проблем с этими методами, если я объявляю и определяю все только в заголовке.
Любая помощь будет оценена.Если вы не можете воспроизвести ошибку, дайте мне знать.