可能重复:
Error on calling default constructor with empty set of brackets
为什么下面的代码编译没有问题,但是当我切换行
时MCl<char, a> tryout;
到
MCl<char, a> tryout();
我收到“错误C2228:'。''的左边必须有class / struct / union”? 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;
}
答案 0 :(得分:4)
MCl<char, a> tryout();
声明函数tryout,它不接收任何内容并返回MCl<char, a>
。
n3337 8.2 / 1
选择是在函数声明之间 带有参数名称周围的冗余括号和带有函数样式的对象声明 作为初始化者。正如6.8中提到的含糊不清一样,决议是考虑任何结构 这可能是声明声明。 [注意:声明可以明确消除歧义 非函数式转换,由=表示初始化或删除多余的括号 参数名称。 - 尾注]
答案 1 :(得分:4)
MCl<char, a> tryout();
这是一个模糊的函数原型或通过void构造函数实例化。这种模糊性被称为“最令人烦恼的解析” - 它甚至在C ++ 03标准本身中进行了讨论!
然而,人们倾向于不提及C ++ 11引入了一种新的语法来通过统一初始化来消除歧义。在这种新语法下,MCl
的实例化将表示为:
MCl<char, a> tryout{};
答案 2 :(得分:0)
声明变量;
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.
是函数的前向声明(称为tryout):
MCl<char, a> tryout();
你想要的可能是:(对于C ++ 03 for 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.