无法显式调用默认构造函数
Can't call default constructor explicitly
可能的重复项:
使用空括号集调用默认构造函数时出错
为什么下面的代码编译没有问题,但是当我切换行时
MCl<char, a> tryout;
自
MCl<char, a> tryout();
我收到"错误 C2228:".ea"的左侧必须有类/结构/联合"?tryout() 不是对默认构造函数的调用吗?
这是完整的代码
template <class T, T myval> class MCl
{
public:
T ea;
MCl() : ea(myval)
{
}
};
int main()
{
const char a = 'e';
MCl<char, a> tryout;
// MCl<char, a> tryout();
cout << tryout.ea;
return 0;
}
MCl<char, a> tryout();
声明函数试用,它不接收任何内容并返回MCl<char, a>
。
N3337 8.2/1
选择函数声明参数名称周围有一组多余的括号,以及具有函数样式的对象声明强制转换为初始值设定项。正如6.8中提到的歧义一样,决议是考虑任何结构这可能是一个宣言,一个宣言。[ 注意:声明可以通过以下方式显式消除歧义非函数样式强制转换,通过 = 表示初始化或删除多余的括号参数名称。—尾注 ]
MCl<char, a> tryout();
这既是函数原型,要么是通过 void 构造函数实例化,这是模棱两可的。这种歧义被掩盖为"最令人烦恼的解析"——甚至在 C++03 标准本身中也进行了讨论!
但是,人们往往不会提到 C++11 引入了一种新的语法,通过统一初始化来消除歧义。在此新语法下,MCl
的实例化将表示如下:
MCl<char, a> tryout{};
声明一个变量;
MCl<char, a> tryout; // uses default constructor if user defined one.
// If compiler generated constructor uses value-initialized
// of members which for POD types means uninitialized.
是函数的前向声明(称为试用):
MCl<char, a> tryout();
你想要的可能是:(对于C++03 C++11,见Mike Kwan)。
MCl<char, a> tryout = MCl<char, a>(); // uses default constructor if user defined one.
// If compiler generated constructor uses zero-initialized
// of members which for POD types means 0 is placed in them.
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 初始化具有非默认构造函数的std::数组项的更好方法
- 具有默认模板类型的默认构造函数的类型推导
- 如何使用非默认构造函数实例化模板化类
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 声明没有默认构造函数的字段
- 没有默认构造函数作为模板参数的自定义比较器
- C++17 没有默认构造函数的地图放置(私有默认构造函数)
- 使用移动调用对等构造函数unique_ptr默认构造函数
- C++复制构造函数和默认构造函数
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- 为什么即使我调用参数化构造函数也会调用默认构造函数?
- 具有非默认构造函数的单例类
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 如何处理没有默认构造函数但在另一个构造函数中构造的对象?
- 在C++中使用默认构造函数初始化对象的不同方法
- 在没有默认构造函数的情况下创建的派生对象
- 强制使用默认构造函数对成员进行未初始化的声明
- 使用默认构造函数初始化对象的不同方法
- 创建类类型的动态分配数组,其中类不得具有默认构造函数