简体   繁体   English

unique_ptr遇到麻烦:不是'std'的成员

[英]Trouble with unique_ptr : not a member of 'std'

I have a hard time finding why compiler tell me this: 我很难找到为什么编译器告诉我这个:

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)

and this: 和这个:

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

I have the include for unique_ptr 我有unique_ptr的include

#include <memory>

and I use the good C++ compilation flags 我使用了很好的C ++编译标志

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

I have already try using namespace std ; 我已经尝试使用namespace std ;

Here are the block of code where I use std::unique_ptr 这是我使用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';
}

I really can find what's wrong with this code, please help 我真的可以找到这个代码有什么问题,请帮忙

Thank you. 谢谢。

edit. 编辑。

Here is the Makefile I use: 这是我使用的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

edit2. EDIT2。

Here a smal code that give me the same errors: 这里有一个小代码,给我相同的错误:

#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;
}

compile with the Makefile above you should have the error 使用上面的Makefile编译你应该有错误

CFLAGS is for C compilers. CFLAGS适用于C编译器。 You are using C++ and a C++ compiler. 您正在使用C ++和C ++编译器。 Use CXXFLAGS in your Makefile to set C++ compiler's flags: 在Makefile中使用CXXFLAGS来设置C ++编译器的标志:

NAME    =   plazza

G++ =   g++

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

SRC =   main.cpp

Since you are setting C flags, C++11 is not enabled because -std=c++11 is not passed to your C++ compiler. 由于您正在设置C标志,因此未启用C ++ 11,因为-std=c++11未传递给您的C ++编译器。 If you compiled with a C compiler, the compiler (at least GCC does it AFAIK) would warn about the C++ flag being set on the C compiler. 如果您使用C编译器进行编译,编译器(至少GCC会将其设置为AFAIK)会警告C编译器上设置的C ++标志。 You could use make VERBOSE=1 in these kind of compiler error situations for debugging. 您可以在这些编译器错误情况下使用make VERBOSE=1进行调试。

Try adding 尝试添加

#include <memory>

To the top of your file. 到您文件的顶部。

If you are creating cmake project, you can add a line of code to CmakeLists.txt as shown below. 如果要创建cmake项目,可以向CmakeLists.txt添加一行代码,如下所示。

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -std=c++11")

Ethereal has explained the details of the reason for the error. Ethereal已经解释了错误原因的细节。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM