我有一个名为 scratch 的类,并使用 scratch.h 来声明它。
现在我在 scratch2.h 下面有另一个名为 scratch2 的类,并希望创建一个临时对象作为共享指针。
这是我在 scratch2 类声明中使用的语法:
std::shared_ptr<scratch> newObject(new scratch());
但我收到此错误:Error: Expected type specifier
所以我尝试了这个:
std::shared_ptr<scratch> newObject2 = std::make_shared<scratch>();
工作正常。任何人都可以告诉我为什么第一个不工作?
我的scratch.h代码:
#ifndef _SCRATCH_
#define _SCRATCH_
#include <iostream>
class scratch {
private:
int _a;
float _b;
std::string _s;
public:
scratch();
scratch(int a, float b, std::string n);
~scratch();
};
#endif
和我的scratch2.h:
#ifndef _SCRATCH_2_
#define _SCRATCH_2_
#include "scratch.h"
#include <memory>
class scratch2 {
std::shared_ptr<scratch> newObject(new scratch()); // Expected a type specifier error occurs here
std::shared_ptr<scratch> newObject2 = std::make_shared<scratch>(); // works fine here
};
#endif
答案 0 :(得分:3)
因为在声明类成员的上下文中:
std::shared_ptr<scratch> newObject(new scratch());
这最初将编译器视为类方法声明。 C ++的语法非常复杂。您可以查看整个声明并了解它尝试做什么,但编译器一次解析一个关键字的关键字,并看到:
类型 名称(...
在类声明中,这开始看起来像一个类方法声明,这是编译器试图解析和失败的原因。
C ++语言的正式规范在如何声明事物的主题上溢出了大量的内容,同时注意到编译器技术的当前状态。
您需要使用编译器,并使用明确的替代语法:
std::shared_ptr<scratch> newObject = std::shared_ptr<scratch>(new scratch());
使用gcc 5.3验证
答案 1 :(得分:1)
在课程定义中,您只有两种方式可以初始化您的成员。您可以使用=
,然后使用{}
。您不能使用()
:
struct foo {
int x = 4; // OK
int y{7}; // OK
int z(12); // error
};
不可否认,在这种情况下,编译器错误非常无用。