2016-12-13 16 views
1

У меня есть HashTable < Клиент> как участник другого класса.Почему компилятор считает, что мое объявление объекта является объявлением функции?

Конструктор для HashTable < T> принимает значение int, чтобы определить размер массива HashTable.

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

Следующая декларация

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

получает ошибку «ожидается спецификатор типа» под 10000. Когда я извлекаю 10000, я получаю сообщение об ошибке «Определение функции для клиентов не найден.» Это заставляет меня думать, что компилятор обрабатывает мое объявление объекта как объявление функции.

Когда я заявляю о своем 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

Является ли декларация «клиентов» внутри класса? – 1201ProgramAlarm

+0

Трудно сказать, что не так с битами и кусками кода. Пожалуйста, опубликуйте [mcve]. –

+0

http://stackoverflow.com/questions/31574575/how-is-this-a-most-vexing-parse –

ответ

4

Вы не разрешается использовать () синтаксис инициализации при подаче инициализаторы членов класса прямо в классе определение. Для этого требуется либо = синтаксис {} -ключенный инициализатор. В вашем случае это будет либо

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. Название предполагает правильные варианты синтаксиса.

2

Вы не можете предоставить инициализатор элемента по умолчанию для переменной-члена таким образом. Вы можете пойти либо

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

или

HashTable<Customer> customers {1000}; 

или непосредственно в конструкторе

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