【问题标题】:Tuples in C++ made properly. How to?C++ 中的元组正确制作。如何?
【发布时间】:2021-02-18 08:37:14
【问题描述】:

我对 C++ 很陌生,所有的红线都让我很烦。我下面的代码 (sn-p) 有效,但它不断突出显示我的 tuplemake_tuple 并带有以下警告:分别为 tuple is not a templateidentifier "make_tuple" is undefined。这是什么意思? 我必须在任何地方定义任何东西吗?

我正在使用 VS Code for Mac。所以,Clang 和我假设是 Xcode。

#include <vector>
//other includes

using namespace std;
//code..
tuple<Gene*, int> find(node* t, bitset<10> bf) {
----- // warning: tuple is not a template                       <--- HERE
    if (something)
        if (match>threshold) {
            return make_tuple(t->g, match);                   //<--- AND HERE
                   ---------- // warning: identifier "make_tuple" is undefined
        }
        else {
            return make_tuple(nullptr,0);
        }
        //code.....
    }

配置:

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "clang++ build active file",
            "command": "/usr/bin/clang++",
            "args": [
                "-std=c++17",
                "-stdlib=libc++",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": "build"
        }
}

【问题讨论】:

  • 红线由您的编辑器/IDE 放在那里。为了帮助您摆脱它们,我们需要知道您使用的是哪个编辑器/IDE。
  • 您需要深入研究 IDE 的智能感知配置。您说您的代码有效(所以我假设它可以编译),这意味着构建设置正确。智能感知并不是它看起来的一部分。
  • 查看编辑。这够了吗,还是我应该上传更多?

标签: c++ tuples warnings


【解决方案1】:

您可能缺少以下一项或两项:

  • #include &lt;tuple&gt; 在文件开头;
  • using namespace std; 指令或 using std::tuple;using std::make_tuple; 声明在封闭范围内。

作为提高代码质量的建议,通常不推荐使用using 指令,因为它们在作用域中引入了比您实际需要的符号多得多的符号。这可能会导致符号绑定出现问题(例如,您的程序和标准库中可能定义了同名的函数,这可能会导致调用站点出现歧义)。这也使得符号在代码中的来源变得不那么明显。改用显式 std:: 命名空间限定,例如std::tuple, std::make_tuple.

【讨论】:

  • 请停止告诉初学者使用 'using namespace std' 这样可以避免许多破坏,并了解它们的来源和归属。
  • @PatrickZ 我没有给出如何改进代码的建议。我正在告诉他们错误的可能原因。
  • 我在答案中添加了避免使用using 指令的建议。
  • @t.niese 不,任何using 声明都可能存在问题,应该避免。有一些例外情况需要使用它(例如在swap 实现中),但一般的经验法则是成立的。
  • @AndreySemashev 我既有包含也有使用。
【解决方案2】:

元组未声明为模板类:检查 tuple 和 make_tuple 所指的位置。查看声明而不是定义会更有帮助,因为这就是错误所在。 最简单的错误是类定义之前缺少模板语句。然后第二个错误将引用这个,因为我假设 t->g 类型是第一个模板参数。

【讨论】:

  • 根据上面的答案,您可能正在尝试使用标准元组,但错误提示您当前设置中已经有另一个类可用该名称。再说一次,声明是必要的,包括包含。
  • 看来我缺少关于声明的知识。
  • 它主要是为了实现和设计的清晰分离。我不喜欢 VS 代码。问题是您的代码段位于何处?将单个 c++ 文件输入编译器?分开的头文件和代码文件?你的 main() 在哪里?显然缺少某些东西,这就是声明返回的模板类元组的地方?应该是 std::tupel 吗?比你必须声明的。对于模板部分:什么是基因?一般来说,由于它是一个指针,所以没有进一步的要求。什么是节点?您的问题中缺少一些重要部分。
  • 准备好被吹走:我没有使用头文件。我找不到设置它的方法,同时仍然有机会在 VS Code 中使用调试器。我理解您对 Gene 和 node 是什么感到沮丧。但是,我看不出它们是什么实际问题,因为这不是逻辑问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多