2013-06-14 2 views
0

У меня есть структуры в C++, который является чем-то вроде этого:Проблемы с шаблоном в структурах структуры в C++

struct mystruct { 
    template <typename T> 
    T myproc() { 
    std::cout << "RETURNING T"; 
    return T(); 
    } 
}; 

Сейчас эта структура уже существует (это просто пример реплика точной структуры), которые мне нужно использовать. То, что я пытаюсь сделать, это вызвать метод myproc(), как показано ниже:

int _tmain(int argc, _TCHAR* argv[]) 
    { 
     mystruct dummystruct; 
     int y = dummystruct.myproc(); 
     return 0; 
    } 

Но это дает мне эту ошибку компиляции:

error C2783: 'T mystruct::myproc(void)' : could not deduce template argument for 'T' 
    see declaration of 'mystruct::myproc' 

который я знаю, потому что компилятор не имеет возможности узнать, что T.

Так что мой вопрос в том, является ли объявление функции в правильной структуре? Я так не думаю, но этот код уже существует в одном из наших старых кодов, поэтому я подумал, что должен получить мнение других.

Поэтому я знаю, что это неправильно, но если кто-то считает его правильным, пожалуйста, объясните мне, как его использовать.

+0

Что вы пытаетесь вернуть из 'myproc'? – 0x499602D2

+3

Возможно, вы имели в виду 'return T();'? –

ответ

5

Я действительно удивлен, что скомпилирован (если это было изначально?).

Шаблон можно охарактеризовать как тип. Вы бы не вернули тип, не так ли?

Ваш код можно посмотреть так.

struct mystruct { 
    int myproc() { 
    std::cout << "RETURNING INT"; 
    return int; 
    } 
}; 

Это не очень корректно.

Если вы хотите вернуть построенное по умолчанию значение, вам нужно будет скопировать круглые скобки.

struct mystruct { 
    template <typename T> 
    T myproc() { 
    std::cout << "RETURNING T"; 
    return T(); 
    } 
}; 

Однако, поскольку параметр шаблона не выводим в контексте s.myproc() вы будете иметь, чтобы сделать s.myproc<mytype>().

+0

Вот что я пытаюсь понять, что тот, кто написал код, он когда-либо компилировал его или нет. –

5

T представляет собой тип, такой как int. Написание return T; будет таким же, как return int;, когда T является int. Действительно ли return int; действителен?

Вы можете позвонить в свой шаблон функции как: dummy.myproc<int>();. Вы должны сказать ему, что T, написав <int>. Если, однако, функция приняла аргумент T, тогда компилятор сможет вывести то, что T, видя тип аргумента. Например, dummy.myproc(2.3) будет решать, как T является double, потому что 2.3 является двойной.

+0

да, но самое смешное, что процедура не принимает никаких аргументов. он делает некоторые виды литья внутри него. Но тем не менее этот тип кастинга, похоже, не разрешает проблему с тем, что есть, если я не передаю аргумент, как вы предложили. –

+0

@PuneetMittal Можете ли вы показать фактический код, который имеет эту проблему? – 0x499602D2

+0

Очень хорошее объяснение. Объяснить это было проще. –

Смежные вопросы