首页 > 解决方案 > 我该如何解决这个奇怪的 c++ std map 问题?

问题描述

我写了一些这样的测试代码:

#include <iostream>
#include <map>
#include <string>

using namespace std;

using TEST_OBJ = std::map<std::string, std::string>;

class ABB
{
public:
    ABB(const TEST_OBJ & src) : m_src(src) {}
public:
    void func() { std::cout << "hello"; }
private:
    TEST_OBJ m_src;
};

int main()
{
    TEST_OBJ o;

    ABB a(TEST_OBJ(Afdafdsaa));


    return 0;
}
  1. 编译器 g++ 使用未定义的变量“Afdafdsaa”成功编译了这段代码</li>
  2. g++ typeid(a).name 告诉我变量“a”是一个函数

有谁能够帮助我?

标签: c++

解决方案


不完全确定你在问什么。这个问题在使代码工作的意义上是不可解决的,因为Afdafdsaa它是未定义的。

但是,如果您想获得更合理的错误,那么最佳实践是使用 C++ 初始化程序语法。基本问题似乎是声明a被解读为函数声明,而不是对象声明。这是因为在这两种情况下都使用了圆括号。

使用初始化语法,大括号用于明确我们正在处理初始化。

因此,将有问题的行更改为:

ABB a{ TEST_OBJ{Afdafdsaa} };

你会得到一个明显的错误。

这个想法是养成一直使用花括号进行初始化的习惯。如果一切正常,它们就像圆括号一样工作,但是当出现问题时,这意味着编译器可以更好地理解你想要做什么。


推荐阅读