为什么编译器认为我的对象声明是函数声明?

时间:2016-12-13 05:30:59

标签: c++ object declare

我有一个HashTable<客户>作为另一个班级的成员。

HashTable的构造函数< T>获取一个int值以确定HashTable数组的大小。

HashTable(int numItems) { ... } //constructor

以下声明

HashTable<Customer> customers(10000); //doesn't call constructor???

收到错误&#34;期望类型说明符&#34;在10000下面。当我删除10000时,我收到错误&#34;未找到客户的功能定义。&#34;这让我相信编译器将我的对象声明视为函数声明。

当我使用动态分配声明我的HashTable时,

HashTable<Customer> * customers = new HashTable<Customer>(10000); //works

与编译器没有混淆。

为什么动态分配有效,而另一方无效?

编辑:这是一个与上述问题相同的最小代码。

#ifndef _BUSINESS_LOGIC
#define _BUSINESS_LOGIC

#include "HashTable.h"

class BusinessLogic
{
public:
    BusinessLogic();
    ~BusinessLogic();
    void start(); 

private:
    HashTable<int> * custom = new HashTable<int>(10000); //works
    HashTable<int> customers(10000); //error
};

#endif


#ifndef _HASH_TABLE
#define _HASH_TABLE

template<class T>
class HashTable
{
public:
    HashTable(int numItems) {
        if (numItems <= 0) {
            throw std::invalid_argument("Invalid HashTable size");
        }
        currItems = 0;

        //B must be the next prime after 2 * numItems
        B = numItems;
    }

    ~HashTable() {
    }


private:
    int B; //size of itemArray
};

#endif

2 个答案:

答案 0 :(得分:6)

在类定义中直接为类成员提供初始化程序时,不允许使用()初始化程序语法。它需要=语法{} - 封闭的初始值设定项。在你的情况下,它将是

HashTable<int> customers{10000};

HashTable<int> customers = 10000;

或者,如果你愿意的话

HashTable<int> customers = { 10000 };

最后两个版本有效,因为您的HashTable专门化提供了适当的转换构造函数。如果该构造函数被声明为explicit,则必须使用

HashTable<int> customers = HashTable<int>(10000); // or `= HashTable<int>{10000}`

代替第二和/或第三种变体。

您尝试使用的初始化程序实际上被称为 brace-or-equal-initializer 。该名称暗示了语法的正确变体。

答案 1 :(得分:3)

您不能以这种方式为成员变量提供默认成员初始值设定项。你可以选择

HashTable<Customer> customers = HashTable<Customer>(1000);

HashTable<Customer> customers {1000};

或直接在构造函数

BusinessLogic::BusinessLogic(): customers(1000) { }