2013-04-08 2 views
1

У меня есть объект, как следующийШаблон Run версия В отличие от Debug

template<typename T> 
inline void UnusedParameter(T const&) 
{ 

} 

class Client 
{ 
public: 
    template<class T> 
    void runFFT(T *wSamples, float const &fMult) 
    { 
    std::cout << "INSIDE RUNFFT : : :" << std::endl; 
    UnusedParameter(wSamples); 
    UnusedParameter(fMult); 
    } 
}; 

И в моем CPP у меня есть следующие:

#include "object.hpp" 

template<> 
void Client::runFFT<int16_t>(int16_t *wSamples, float const &fMult) 
{ 
    std::cout << "INSIDE INT16_T version: : :" << std::endl; 
    UnusedParameter(wSamples); 
    UnusedParameter(fMult); 
} 

template<> 
void Client::runFFT<Ipp32f>(Ipp32f *wSamples, float const &fMult) 
{ 
    std::cout << "INSIDE IPP32F version: : :" << std::endl; 
    UnusedParameter(wSamples); 
    UnusedParameter(fMult); 
} 

Оба эти реализации работать без каких-либо проблем в моей отладки кода , Он входит в версию int16_t без проблем, а версия Ipp32f также без проблем.

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

Как предотвратить это? Удалить это и просто создать два разных метода? Мне нравятся мои шаблоны, но эти ошибки Гейзенберга удручающие.

Спасибо за любой ввод.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Энди Проул ответил на этот вопрос, и решается в ГЭС:

template<typename T> 
inline void UnusedParameter(T const&) 
{ 

} 

class Client 
{ 
public: 
    template<class T> 
    void runFFT(T *, float const &) 
    { 
    // Thanks for Joachim for removing my Unused Parameter crap 
    std::cout << "INSIDE RUNFFT : : :" << std::endl; 
    } 
}; 

template<> 
void Client::runFFT<int16_t>(int16_t *wSamples, float const &fMult); 

template<> 
void Client::runFFT<Ipp32f>(Ipp32f *wSamples, float const &fMult); 

И теперь это работает во время работы. CPP остается неизменным.

+2

Небольшой совет: если вы не хотите предупреждений «неиспользуемый аргумент», просто объявите тип, но не имя. Как 'void runFFT (T *, float const &)' –

+0

Является ли 'AnalyzerClient' подклассом' Client'? –

+1

Что касается вашей проблемы, отладчик обычно очищает все переменные, даже локальные переменные. Это означает, что у вас может быть проверка «NULL», которая преуспевает в отладчике, но не выполняется, когда вы не запускаете в отладчике. Чтобы решить эту проблему, убедитесь, что вы правильно инициализировали все переменные, например указатели указателей на '0' (или' NULL' или 'nullptr'). –

ответ

3

Проблема, скорее всего, в том, что вы низведены специализациях вашей функции члена runFFT() для int16_t и Ipp32f в отдельном .cpp файла без предоставления соответствующего заявления после первичного шаблона, так что компилятор в момент создания экземпляра (который, вероятно, относится к другой единицы перевода, что #include s только заголовочный файл, содержащий определение Client), не знает о существовании этих явных специализаций.

Поместите декларацию для тех специализаций в одном заголовочном файле, который содержит определение шаблона класса:

template<typename T> 
inline void UnusedParameter(T const&) { } 

class Client 
{ 
public: 
    template<class T> 
    void runFFT(T *wSamples, float const &fMult) 
    { 
     std::cout << "INSIDE RUNFFT : : :" << std::endl; 
     UnusedParameter(wSamples); 
     UnusedParameter(fMult); 
    } 
}; 

// DECLARE YOUR EXPLICIT SPECIALIZATIONS HERE 

template<> 
void Client::runFFT<int16_t>(int16_t *wSamples, float const &fMult); 

template<> 
void Client::runFFT<Ipp32f>(Ipp32f *wSamples, float const &fMult); 

в соответствии с пунктом 14.7.3/6 из C++ 11 Стандарт на:

Если шаблон, шаблон члена или члена шаблона класса явно специализированное то, что специализация должна быть декабрь до первого использования этой специализации, что приведет к неявному экземпляру , имеющему место, в каждой единицы перевода, в которой такое использование происходит; не требуется диагностика. [...]

«нет диагностики не требуется» часть означает, что если вы не будете следовать этому правилу, ваша программа будет плохо сформирован, но ваш компилятор/компоновщик не требуется, чтобы сказать вы. Это обычно приводит к типу неопределенного поведения, которое вы наблюдаете.

+0

Нет, это даст «множественное определение ошибки void Client :: runFFT (float *, float const &)». Специализация шаблонов входит в файл CPP. Составлено с GCC 4.3.3 – Claudiordgz

+1

@Claudiordgz: Правильно, извините. Я хотел написать «поставить декларацию для этих специализаций». Если вы этого не сделаете, компилятор не будет знать о их существовании. –

+0

Ты потрясающий Andry Prowl. Большое спасибо. – Claudiordgz

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