拆分constexpr函数定义时遇到问题

时间:2019-04-15 22:54:20

标签: c++ c++11 visual-c++

在头文件和.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方法分解为一个单独的文件吗?如果我仅在标头中声明和定义所有内容,则编译器对这些方法没有任何问题。

任何帮助将不胜感激。如果您无法重现该错误,请告诉我。

0 个答案:

没有答案