在头文件和.ipp文件之间分解constexpr
时遇到了一些麻烦。我以here为例(看幻灯片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方法分解为一个单独的文件吗?如果我仅在标头中声明和定义所有内容,则编译器对这些方法没有任何问题。
任何帮助将不胜感激。如果您无法重现该错误,请告诉我。