unique_ptr出现问题:不是'std'的成员。

12

我很难找到编译器告诉我的原因:

main.cpp:51:17: error: ‘unique_ptr’ in namespace ‘std’ does not name a template type
 static std::unique_ptr<Pizza> createPizza(PizzaType t_pizza)

和这个:

main.cpp:69:5: error: ‘unique_ptr’ is not a member of ‘std’
 std::unique_ptr<Pizza> pizza = PizzaFactory::createPizza(t_pizzaType);

我已经包含了unique_ptr

#include <memory>

而且我使用良好的C++编译标志

CFLAGS  =   -std=c++11 -W -Wall -Wextra -Werror -pedantic

我已经尝试使用 using namespace std;

这是我使用 std::unique_ptr 的代码块

class PizzaFactory
{
 public:
  enum PizzaType
  {
  Hawaiian,
  Vegetarian,
  Carnivoro
  };

  static std::unique_ptr<Pizza> createPizza(PizzaType t_pizza)
  {
  switch (t_pizza)
  {
  case Hawaiian:
    return std::unique_ptr<HawaiianPizza>(new HawaiianPizza());
  case Vegetarian:
    return std::unique_ptr<VegetarianPizza>(new VegetarianPizza());
  case Carnivoro:
    return std::unique_ptr<CarnivoroPizza>(new CarnivoroPizza());
  default:
    throw "Invalid pizza type.";
  }
  }
};

void pizza_information(PizzaFactory::PizzaType t_pizzaType)
{
  std::unique_ptr<Pizza> pizza = PizzaFactory::createPizza(t_pizzaType);
  std::cout << "Price of " << t_pizzaType << "is " << pizza->getPrice() << '\n';
}

我真的找不出这段代码的问题,请帮忙。

谢谢。

编辑。

这是我使用的Makefile:

NAME    =   plazza

G++ =   g++

CFLAGS  =   -W -Wall -Wextra -Werror -std=c++11

SRC =   main.cpp

OBJ =   $(SRC:.cpp=.o)

RM  =   rm -rf

all:    $(NAME)

$(NAME):    $(OBJ)
    $(G++) $(CFLAGS) $(OBJ) -o $(NAME)

clean:
    $(RM) $(OBj)

fclean: clean
    $(RM) $(NAME)

re: fclean  all

编辑2。

这是一小段代码,给我带来了同样的错误:

#include <memory>
#include <iostream>

class Hi
{
    public:
        void sayHi(const std::string &t_hi)
        {
            std::cout << t_hi << '\n';
        }
};

int main()
{
    auto hi = std::unique_ptr<Hi>(new Hi());

    hi->sayHi("Salut");
    return 0;
}

如果您使用以上的Makefile进行编译,您应该会出现错误。


4
你在哪里包含<memory>?能否请尝试创建一个最小、完整和可验证的示例并向我们展示? - Some programmer dude
似乎你的 make 文件中有 #include,而不是源文件。 - myaut
问一个很显然的问题:您是否已经在您的源代码中定义了Pizza, HawaiianPizza, VegetarianPizzaCarnivoroPizza这些类,或者您已经在包含的头文件中声明了它们? - Steve
所有的代码都在一个独特的main.cpp文件中,我已经定义了我所需要的所有类。 - Mocking Bird
在使用makefile构建时,请查看输出和创建对象文件的命令。你的标志位是否缺失? - Some programmer dude
3个回答

20
尝试添加
#include <memory>

到你文件的顶部。


6

CFLAGS 是针对 C 编译器的。您正在使用 C++ 和 C++ 编译器。请在您的 Makefile 中使用 CXXFLAGS 来设置 C++ 编译器的标志:

NAME    =   plazza

G++ =   g++

CXXFLAGS  =   -W -Wall -Wextra -Werror -std=c++11

SRC =   main.cpp

由于您正在设置C标志,因此未启用C++11,因为没有将-std=c++11传递给您的C++编译器。如果您使用C编译器进行编译,编译器(至少我知道的是GCC)会警告在C编译器上设置了C++标志。您可以在这些编译器错误情况下使用make VERBOSE=1进行调试。


1
谢谢您,它起作用了。我不知道Makefile中变量的名称很重要。再次感谢。 - Mocking Bird
1
@MockingBird 不用谢。在 StackExchange 网站上,如果答案解决了你的问题,你应该将其标记为被接受的答案,这样问题就会被关闭(可以在投票按钮下方完成)。 - Etherealone

0
如果你正在创建cmake项目,可以像下面这样在CmakeLists.txt文件中添加一行代码。
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -std=c++11")

Ethereal已经解释了错误的原因细节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接