如何定义专用模板的成员函数 class?

How do I define a member function of a specialized template class?

我有一个模板 class ProcessPromise<T> 及其专业化 ProcessPromise<void> 取决于 ProcessTask<T>:

template<typename T>
struct ProcessTask;

template<typename T>
class ProcessPromise
{
public:
    ProcessTask<T> get_return_object();
};

template<>
class ProcessPromise<void>
{
public:
    ProcessTask<void> get_return_object();
};

template<typename T>
struct ProcessTask
{
};

template<typename T>
ProcessTask<T> ProcessPromise<T>::get_return_object()
{
    return { };
}

不知道如何定义 ProcessPromise<void>::get_return_object()

尝试了以下代码:

template<>
ProcessTask<void> ProcessPromise<void>::get_return_object()
{
    return { };
}

但是编译不通过,GCC错误:

    prog.cc:30:23: error: template-id 'get_return_object<>' for 'ProcessTask<void> ProcessPromise<void>::get_return_object()' does not match any template declaration
30 |     ProcessTask<void> ProcessPromise<void>::get_return_object()
    |                       ^~~~~~~~~~~~~~~~~~~~
prog.cc:15:27: note: candidate is: 'ProcessTask<void> ProcessPromise<void>::get_return_object()'
15 |         ProcessTask<void> get_return_object();
    |                           ^~~~~~~~~~~~~~~~~

MSVC 错误:

error C2910: 'awl::ProcessPromise<void>::get_return_object': cannot be explicitly specialized

只需删除 template<> 前缀,如下所示:

//no prefix template<> needed here
inline ProcessTask<void> ProcessPromise<void>::get_return_object()
{
    return { };
}

Working demo

请注意,添加 inline 关键字是为了避免出现多重定义错误。

说明>

我们不需要前缀 template<> 的原因是我们正在为一个完整的成员函数提供一个普通的 out-of-class 定义 class 模板专业化。也就是说,我们实际上并没有特化成员函数,而是在 class 定义之外为该成员函数提供一个普通的 (non-template)。