如何定义专用模板的成员函数 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 { };
}
请注意,添加 inline
关键字是为了避免出现多重定义错误。
说明>
我们不需要前缀 template<>
的原因是我们正在为一个完整的成员函数提供一个普通的 out-of-class 定义 class 模板专业化。也就是说,我们实际上并没有特化成员函数,而是在 class 定义之外为该成员函数提供一个普通的 (non-template)。
我有一个模板 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 { };
}
请注意,添加 inline
关键字是为了避免出现多重定义错误。
说明>
我们不需要前缀 template<>
的原因是我们正在为一个完整的成员函数提供一个普通的 out-of-class 定义 class 模板专业化。也就是说,我们实际上并没有特化成员函数,而是在 class 定义之外为该成员函数提供一个普通的 (non-template)。