簡體   English   中英

C++條件模板類成員函數定義

[英]C++ conditional template class definition of member function

給定頭文件中的以下類前向聲明​​:

template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
class context
{
public:
    context();
// ....
private:
// ....
    T data;
}

如何在 cpp 文件中定義構造函數(或任何其他成員函數)? 嘗試了我能想到的一切,但沒有匹配的......

這個另一個問題引起了我的注意為什么模板只能在頭文件中實現? 並且我已經在我的項目的多個地方成功地使用了接受的答案中建議的方法,但是我找不到以任何方式表示第二個模板參數的方法......該問題沒有提供足夠的信息來做到這一點。 問題是這里的第二個模板參數要么與建議的方式不兼容,要么我找不到合適的語法來表示它,如果我的類只有第一個參數,它會回答它......

PS抱歉,如果這是重復的,我真的試圖找到一個類似的問題,只是找不到合適的術語來找到匹配項。

要提供類外定義,模板參數列表必須匹配。

template<typename T, std::enable_if_t<std::is_integral_v<T>, int> N>
context<T, N>::context() {
}

參數類型是類模板定義中的std::enable_if_t<std::is_integral_v<T>, int> 這正是類外定義中需要的參數類型。

順便說一句,我認為支票目前的位置沒有任何好處。 與函數模板不同,這可能會影響重載解析,類模板即使從該機制中也不會受益太多。 IMO 最好在類模板聲明中簡單地添加一個靜態斷言

template<typename T>
class context {
    static_assert(std::is_integral_v<T>, "Must be initialized with an integral type");
    // ...
};

然后類外成員聲明變得更加直接。 關於錯誤模板參數的錯誤消息更具可讀性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM