我在Windows上編譯這段代碼時遇到了麻煩。
這段代碼在 Linux 上的編譯是正確的,無論是使用 clang 還是 gcc。我使用的是 msvc 19.29.
。Msvc退出時出現了不太有用的錯誤C1001。
struct Object{}。
class Storage {
Object &createObject() {
qStorrage.push_back(Object{})。
return qStorrage.back()。
}
template <class...。Objs>
void deleteObject(const Objs& ... obj)
{
const auto e = std::remove_if(qStorrage.begin(), qStorrage. end(), [&](const auto &i) { return ( (i == obj) || ...) ; }) 。
qStorrage.erase(e, qStorrage.end() )。)
}
目標是能夠傳遞多個要洗掉的Object的參考,以避免多次呼叫同一個函式。
Storage stor;
auto a = stor.create()。
auto b = stor.create()。
stor.delete(a, b)。
你知道為什么MSVC不能編譯這個嗎?
編輯:
這里是實際的檔案:
https://github.com/zcorniere/logger-cpp/blob/windows/include/Logger.hpp
https://github.com/zcorniere/logger-cpp/blob/windows/example/example.cpp
使用 cmake 構建,引數 BUILD_EXAMPLE 為 ON
。編輯2。 這里是msvc的錯誤資訊,抱歉我忘了
message: This diagnostic occurred in the compiler generated function 'bool ProgressBar::operator ==(const ProgressBar &) const' [C:Usersacharie CorniereDocumentsGitHublogger-ppuildexampleexample.vcxproj]
[build] C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29. 30133includexmemory(1967): message : see reference to function template instantiation bool Logger: :deleteProgressBar::<lambda_1>::operator()<ProgressBar>(const _T1 &) const'正在編譯 [logger-cppuildexampleexample. vcxproj] 。
[構建]與
[構建] [構建
[build] _T1=ProgressBar
[build] ]。
[build] logger-cppincludeLogger。 hpp(51): message : See reference to function template instantiation '_FwdIt std:: remove_if<std::_Deque_iterator<std::_Deque_val<std::_Deque_simple_types<_Ty>>,Logger::deleteProgressBar::<lambda_1>>(_FwdIt, const _FwdIt,_Pr)'/span>被編譯 [logger-cppuildexampleexample. vcxproj] 。
[構建]與
[構建] [構建
[build] _FwdIt=std::_Deque_iterator<std::_Deque_val<std::_Deque_simple_types<ProgressBar>&gt;&gt; 。
[build] _Ty=ProgressBar,
[build] _Pr=Logger::deleteProgressBar::<lambda_1>
[build] ]。
uj5u.com熱心網友回復:
C1001是內部編譯器錯誤
它是用來表示編譯器本身的錯誤,被編譯的代碼不一定是錯誤的。
將ICE報告到https://developercommunity.visualstudio.com/或通過Help > Send Feedback > Report a problem...從Visual Studio
嘗試減少產生ICE的具體內容。這將有助于做出一個好的錯誤報告,并避免在你的代碼中出現ICE,因為可能很快就會有一個修復方法。
我減少了你的例子:
#include <vector>
class ProgressBar
{
public:
std::strong_ordering operator<=>(const ProgressBar &) const =default;
};
std::vector<ProgressBar> v;
template <class...。Objs>
void deleteObject(const Objs& ... obj)
{
std::remove_if(v.begin(), v. end(), [&](const auto &i) { return ( (i == obj) || ...); }) 。
}
int main()
{
進度條p。
deleteObject(p)。
}
請看重新創建的錯誤資訊。https://godbolt.org/z/dbz34PcTf
解決方案
除了<=>運算子之外,在ProgressBar中添加==運算子:
std:: strong_ordering operator<=>(const ProgressBar &) const =default;
bool operator==(const ProgressBar &) const =default;
uj5u.com熱心網友回復:
它不會被編譯,因為delete是一個保留關鍵字。將'd'改為'D'。
你還需要在結構定義的末尾添加一個分號。
而且你需要宣告qStorrage成員(比如std::vector<Object> qStorrage;)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/316136.html
標籤:
上一篇:我以后可以推匯出模板論證嗎?
