编译错误:“声明的嵌套名称说明符未引用类、类模板或类模板部分特化”

Pan*_*apa 1 c++ type-traits enable-if c++17

我有2个文件:

摘要.hpp

template <typename T, typename = std::enable_if_t<std::is_base_of_v<DigestCreator, T>>>
class DigestHolder {
public:
    DigestHolder();
};
#include "digest.ipp" // Included here.
Run Code Online (Sandbox Code Playgroud)

摘要.ipp

template <typename T, std::enable_if_t<std::is_base_of_v<DigestCreator, T>>>
DigestHolder<T>::DigestHolder()
{};
Run Code Online (Sandbox Code Playgroud)

该类在hpp文件中声明并在ipp文件中定义。该ipp文件包含在文件末尾hpp

但是,我收到编译错误:

error: nested name specifier 'DigestHolder<T>::' for declaration does not refer into a class, class template or class template partial specialization
DigestHolder<T>::DigestHolder()
Run Code Online (Sandbox Code Playgroud)

谁能帮我解决这个问题吗?

我尝试修改hpp模板声明如下,但没有好的结果:

尝试1:

template<typename T, std::enable_if_t<std::is_base_of_v<DigestCreator, T>, std::nullptr_t> = nullptr> 
class DigestHolder {};
Run Code Online (Sandbox Code Playgroud)

尝试2:

template<typename T, std::enable_if_t<std::is_base_of_v<DigestCreator, T>, bool> = true> 
class DigestHolder {};
Run Code Online (Sandbox Code Playgroud)

mol*_*ilo 6

该模板有两个参数,即使您为其中之一提供了默认值。
您需要命名第二个参数以便在定义中引用它,并且不应提供另一个默认参数:

template <typename T, typename U>
DigestHolder<T, U>::DigestHolder() {}
Run Code Online (Sandbox Code Playgroud)