2016-07-26 3 views
0

После создания шаблонного класса C++, который принимает целое число в файле заголовка, я обнаружил, что Eclipse не распознает реализации моего метода в соответствующем .cpp-файле.Объявление участника не найдено, когда шаблон шаблона принимает целое число

Вот пример класса, который принимает параметр шаблона Размер:

template <int SIZE> 
class SizeableClass 
{ 
public: 
    SizeableClass(); 
    virtual ~SizeableClass(); 
}; 

Я сказал Eclipse, для создания органов по осуществлению меня с Source => Реализовать метод ...

Он произвел несколько встроенных методов в файле заголовка. Я переместил их в файл .cpp для удобства и снял квалификатор inline. Мой файл .cpp Теперь выглядел следующим образом:

template<int SIZE> 
SizeableClass<>::SizeableClass() 
{ 
} 

template<int SIZE> 
SizeableClass<>::~SizeableClass() 
{ 
} 

Но это было подчеркнуто красным цветом с «декларацией члены не нашли» сообщение об ошибке. Он не будет компилировать с gcc либо:

SizeableClass.h:2:7: error: provided for ‘template<int SIZE> class SizeableClass’ 
class SizeableClass 
    ^

Что случилось с этим?

+0

Кому бы ни было downvoted/voted, чтобы закрыть: вы могли бы оправдать себя, чтобы я мог улучшить вопрос? – CJxD

+1

Это ошибка в работе «Метод внедрения» CDT. Я отправил https://bugs.eclipse.org/bugs/show_bug.cgi?id=510289 для отслеживания. – HighCommander4

ответ

4

Генератор Eclipse, похоже, пропустил ключевую часть реализаций. Это будет иметь ту же проблему, даже если они не были перемещены из файла заголовка.

Обычно используются шаблоны с typenames, таких как:

template<typename T> 
SizeableClass<T>::SizeableClass() 
{ 
} 

template<typename T> 
SizeableClass<T>::~SizeableClass() 
{ 
} 

Так что простительно думать, что если вы не используете typenames там не нужно быть что-нибудь между угловыми скобками (<>).

Однако в этом случае параметр шаблона SIZE должен находиться в этих скобках. Файл .cpp следует читать:

template<int SIZE> 
SizeableClass<SIZE>::SizeableClass() 
{ 
} 

template<int SIZE> 
SizeableClass<SIZE>::~SizeableClass() 
{ 
} 

// Additionally, if there are any methods that return SizeableClass, they also need to be parametrized 
template<int SIZE> 
SizeableClass<SIZE> SizeableClass<Size>::myMethod() 
{ 
} 

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

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

  • Нет связанных вопросов^_^