【问题标题】:Predefined C++ Types (compiler internal) Not Found error预定义 C++ 类型(编译器内部)未找到错误
【发布时间】:2021-12-06 17:17:12
【问题描述】:

我尝试编写井字游戏只是为了好玩,但在尝试调试应用程序时遇到了这个错误。错误发生在第 23 行,多维 std::array 声明。我找不到有关该主题的任何材料或提出自己的解决方案。该错误显示在 VS 2019 的“找不到源”选项卡中,看起来不像是正常错误,这是文本:“找不到预定义的 C++ 类型(编译器内部) 您需要找到预定义的 C++ 类型(编译器内部)来查看当前调用堆栈帧的源代码。”

#include <io.h>
#include <fcntl.h>
#include <iostream>
#include <algorithm>
#include <array>
#include <string>

class tic_tac_toe
{
private:
    enum class values
    {
        X,
        O,

        max_values
    };
    struct square_data
    {
        std::string code{};
        values value{};
    };
    std::array<std::array <square_data, 3>, 3> board{};
public:
    tic_tac_toe()
    {
        for (int a{ 0 }; a < 3; ++a)
        {
            for (int b{ 0 }; b < 3; ++b) { 
                switch (a)
                {
                case 0:
                    board.at(a).at(b).code = "A";
                    board.at(a).at(b).value = values::max_values;
                    break;
                case 1:
                    board.at(a).at(b).code = "B";
                    board.at(a).at(b).value = values::max_values;
                    break;
                case 2:
                    board.at(a).at(b).code = "C";
                    board.at(a).at(b).value = values::max_values;
                    break;
                default:
                    std::cout << "initializer failed\n"; //shouldn't happen
                }
                board.at(a).at(b).code.append(std::to_string((b + 1)));
            }
        }
        print_grid();
    }

    void print_code(square_data square)
    {
        switch (square.value)
        {
        case values::X:
            std::wcout << L"X";
            break;
        case values::O:
            std::wcout << L"O";
            break;
        default:
            std::wcout << L" ";
        }
    }

    void print_grid()
    {
        fflush(stdout);
        int previous{ _setmode(_fileno(stdout), _O_U16TEXT) }; //print unicode
        for (int a{ 0 }; a < 3; ++a)
        {
            switch (a)
            {
            case 0:
                std::wcout << L"\n┌───┬───┬───┐\n│ ";
                break;
            case 1:
                std::wcout << L"\n├───┼───┼───┤\n│ ";
                break;
            case 2:
                std::wcout << L"\n├───┼───┼───┤\n│ ";
                break;
            default:
                std::cout << "printer failed\n";
            }
            for (int b{ 0 }; b < 3; ++b) {
                print_code(board.at(a).at(b));
                std::wcout << L" │ ";
            }

        }
        std::wcout << L"\n└───┴───┴───┘\n";
        fflush(stdout);
        _setmode(_fileno(stdout), previous); //for switching back to narrow output
    }
};

int main()
{
    tic_tac_toe game{};

    return 0;
    
}

【问题讨论】:

  • 一旦我添加了#include &lt;io.h&gt;main 函数,编译和运行你的代码就没有问题了。你能更详细地解释你在做什么吗?我假设您正在尝试进入调试器中的某些内容。如果你越过那条线,或者在它找不到源的时候就走了,会发生什么?
  • @RetiredNinja 代码确实编译得很好,并且到目前为止它的工作方式符合我的预期。但是当我进入第 23 行时,调试会失败。如果你在它抛出错误时退出,那么所有发生的事情都是调试结束,当你越过该行时它仍然会抛出错误。编辑以修复 io.h 不存在。由于它是从 main() 执行的第三行,因此基本上无法进行调试,并且需要调试才能完成游戏。
  • 请发帖minimal reproducible example。您显示的代码中没有main
  • 使用调试 > 当您不小心进入调试器无法显示源代码的代码时退出。
  • @n.1.8e9-where's-my-sharem。完成。

标签: c++ visual-studio


【解决方案1】:

这是VS的错误。它在我删除 /permissive- 时起作用。此problem 已被举报。

【讨论】:

  • 这行得通,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多