使用模板的C++代码在C++20中无法编译,但在C++17中是可以的。

huangapple go评论127阅读模式
英文:

The C++ code that using templates doesn't compile in c++ 20, but was ok in c++ 17

问题

我有一些遗留代码,我想将其升级到C++20。该代码在C++17中编译没有任何问题,但如果我切换到C++20就会失败。我尽可能简化了代码,请看一下这个例子。我在Windows上使用Visual Studio 2022。

以下是错误消息:

  1. error C2027: use of undefined type 'ArrayWrapper'
  2. message : see declaration of 'ArrayWrapper'
  3. message : see reference to class template instantiation 'ArrayClass<T>' being compiled

我在Stack Overflow和C++文档中查找过,但无法弄清楚在C++20中这段代码有什么问题。有人能解释如何解决这个问题吗?谢谢!

英文:

I have some legacy code that I want to upgrade to c++20. The code compiles in c++17 without any issues but fails if I switch to C++20. I simplified the code as much as possible, please look at the example. I am using Visual Studio 2022 on Windows

  1. class MyFile
  2. {
  3. public:
  4. void Read(){ }
  5. };
  6. class ArrayWrapper;
  7. class BaseClass
  8. {
  9. public:
  10. ArrayWrapper* arrayWrapper;
  11. };
  12. template &lt;class T&gt; class ArrayClass : public BaseClass
  13. {
  14. public:
  15. void Add()
  16. {
  17. arrayWrapper-&gt;file.Read();
  18. }
  19. };
  20. class ArrayWrapper
  21. {
  22. public:
  23. ArrayWrapper(): file(new MyFile()){ }
  24. ~ArrayWrapper() { delete file; }
  25. MyFile* file;
  26. ArrayClass&lt;int&gt; Array{};
  27. void Update()
  28. {
  29. Array.Add();
  30. }
  31. };
  32. int main()
  33. {
  34. ArrayWrapper wrapper;
  35. wrapper.Update();
  36. }

And this is the error message that I am getting:

  1. error C2027: use of undefined type &#39;ArrayWrapper&#39;
  2. message : see declaration of &#39;ArrayWrapper&#39;
  3. message : see reference to class template instantiation &#39;ArrayClass&lt;T&gt;&#39; being compiled

I did look on the stack overflow and in the C++ docs but couldn't figure out what is wrong with this code in C++ 20
Can someone explain how to fix this issue, please?

答案1

得分: 1

ArrayClass::Add的定义移动到ArrayWrapper之后。

在类模板的定义之后,方法和整个ArrayClass<int>被实例化,此时ArrayWrapper还没有完全定义。

如果ArrayClass不是一个模板,你将会得到相同的错误。

  1. class MyFile
  2. {
  3. public:
  4. void Read(){ }
  5. };
  6. class ArrayWrapper;
  7. class BaseClass
  8. {
  9. public:
  10. ArrayWrapper* arrayWrapper;
  11. };
  12. template <class T> class ArrayClass : public BaseClass
  13. {
  14. public:
  15. void Add();
  16. };
  17. class ArrayWrapper
  18. {
  19. public:
  20. ArrayWrapper(): file(new MyFile()){ }
  21. ~ArrayWrapper() { delete file; }
  22. MyFile* file;
  23. ArrayClass<int> Array{};
  24. void Update()
  25. {
  26. Array.Add();
  27. }
  28. };
  29. template <class T>
  30. void ArrayClass<T>::Add()
  31. {
  32. arrayWrapper->file->Read();
  33. }
  34. int main()
  35. {
  36. ArrayWrapper wrapper;
  37. wrapper.Update();
  38. }

另外,应该是arrayWrapper->file->Read();file是一个指针。

英文:

Move ArrayClass::Add definition after ArrayWrapper.

The method and the whole ArrayClass&lt;int&gt; is instantiated right after the definition of the class template, at which point ArrayWrapper is still not fully defined.

You would get the same error if ArrayClass was not a template.

  1. class MyFile
  2. {
  3. public:
  4. void Read(){ }
  5. };
  6. class ArrayWrapper;
  7. class BaseClass
  8. {
  9. public:
  10. ArrayWrapper* arrayWrapper;
  11. };
  12. template &lt;class T&gt; class ArrayClass : public BaseClass
  13. {
  14. public:
  15. void Add();
  16. };
  17. class ArrayWrapper
  18. {
  19. public:
  20. ArrayWrapper(): file(new MyFile()){ }
  21. ~ArrayWrapper() { delete file; }
  22. MyFile* file;
  23. ArrayClass&lt;int&gt; Array{};
  24. void Update()
  25. {
  26. Array.Add();
  27. }
  28. };
  29. template &lt;class T&gt;
  30. void ArrayClass&lt;T&gt;::Add()
  31. {
  32. arrayWrapper-&gt;file-&gt;Read();
  33. }
  34. int main()
  35. {
  36. ArrayWrapper wrapper;
  37. wrapper.Update();
  38. }

Also, it should be arrayWrapper-&gt;file-&gt;Read(); file is a pointer.

huangapple
  • 本文由 发表于 2023年7月27日 18:03:30
  • 转载请务必保留本文链接:https://go.coder-hub.com/76778627.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定