3

可能重复:
使用空括号调用默认构造函数时出错

为什么下面的代码编译没有问题但是当我换行时

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

3 回答 3

4
MCl<char, a> tryout();

声明函数 tryout,它什么也不接收并返回MCl<char, a>

n3337 8.2/1

选择是在参数名称周围带有一组冗余括号的函数声明和以函数样式强制转换作为初始值设定项的对象声明之间进行选择。就像 6.8 中提到的歧义一样,解决方案是将任何可能是声明的构造视为声明。[ 注意:声明可以通过非函数风格的强制转换、= 表示初始化或删除参数名称周围的多余括号来明确消除歧义。——尾注]

于 2012-10-06T11:52:32.937 回答
4
MCl<char, a> tryout();

这无论是作为函数原型还是通过 void 构造函数实例化都是模棱两可的。这种模棱两可已被掩盖为“最令人烦恼的解析”——它甚至在 C++03 标准本身中进行了讨论!

然而,人们往往不会提到 C++11 引入了一种新的语法来通过统一初始化来消除歧义。在这种新语法下,您的实例化MCl将表示为:

MCl<char, a> tryout{};
于 2012-10-06T11:53:16.663 回答
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.

是对函数的前向声明(称为试用):

MCl<char, a> tryout();

您想要的可能是:(对于 C++11 的 C++03,请参阅 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.
于 2012-10-06T16:07:18.627 回答