這個問題在這里已經有了答案: 顯式模板專業化錯誤 2 個答案 模板專業化:非行內函式定義問題 1 個回答 21 小時前關閉。
我有一個模板類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
uj5u.com熱心網友回復:
只需洗掉template<>前綴,如下所示:
//no prefix template<> needed here
inline ProcessTask<void> ProcessPromise<void>::get_return_object()
{
return { };
}
作業演示
請注意,inline添加關鍵字是為了避免出現多重定義錯誤。
說明>
我們不需要前綴的原因template<>是我們為完整的類模板特化的成員函式提供了一個普通的類外定義。也就是說,我們實際上并沒有特化成員函式,而是為該成員函式提供了一個普通的(非模板)類定義之外的定義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/476402.html
