无法显式调用默认构造函数

时间:2012-10-06 11:50:55

标签: c++ constructor

  

可能重复:
  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;
}

3 个答案:

答案 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.