C ++: странное отсутствие ';'до ошибки, из-за typedef'а возвращаемого типа в шаблонном классе - PullRequest
1 голос
/ 14 марта 2012

Я получаю очень запутанную ошибку компилятора при создании следующего тестового кода.

f:\data\sdks\smctc-1.00\examples\ik_pf\msvc\MarkerSampler.inl(16): error C2143: syntax error : missing ';' before 'MarkerSampler<MarkerT>::sample2'
f:\data\sdks\smctc-1.00\examples\ik_pf\msvc\MarkerSampler.inl(16): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

Обратите внимание, что пример сборки без ошибок, но sample2 вызывает проблему. Единственным отличием является то, что одно явно детализирует возвращаемый тип без использования typedef, а другое использует версию с типом определения.

.h файл

#pragma once
#ifndef __MARKERSAMPLER_H_INCLUDED__
#define __MARKERSAMPLER_H_INCLUDED__

#include <vector>
#include <string>

#include <qthread.h>

#include <Wm5Vector3.h>
#include "UtilityFunctions.h"
#include "Marker.h"
#include "MarkerSet.h"

template <class MarkerT>
class MarkerSampler : public QThread
{


  typedef std::vector<MarkerT> MarkerVector ;
  typedef MarkerSet<MarkerT> MarkerSetT ;
  typedef std::vector<MarkerSetT> MarkerSetVector ;

public :

 MarkerSampler(const std::string inputDataDirectory, const unsigned int nSamples, const unsigned int startFrame, const unsigned int nFramesToUse) : 
    inputDataDirectory_(inputDataDirectory), nSamples_(nSamples), startFrame_(startFrame), nFramesToUse_(nFramesToUse) {seed = -time(NULL) ;}

 ~MarkerSampler() {}

 std::vector<MarkerSet<MarkerT> > sample(const double scaleFactor = 1.0, const double noiseSD = 0.0) ;

 MarkerSetVector sample2(const double scaleFactor = 1.0, const double noiseSD = 0.0) ;

protected:
 void run();

private:

 int seed ;

 const std::string inputDataDirectory_ ;
 const unsigned int nSamples_ ;
 const unsigned int startFrame_ ;
 const unsigned int nFramesToUse_ ;


} ;

 #include "MarkerSampler.inl"

#endif

.inl file

template <class MarkerT>
std::vector<MarkerSet<MarkerT> > MarkerSampler<MarkerT>::sample(const double scaleFactor, const double noiseSD)
{
....
}

template <class MarkerT>
MarkerSetVector MarkerSampler<MarkerT>::sample2(const double scaleFactor, const double noiseSD)
{
....
}

1 Ответ

5 голосов
/ 14 марта 2012

пропавших без вести; часть этой ошибки немного вводит в заблуждение, компилятор фактически не распознает тип MarkerSetVector. Я думаю, это потому, что это typedef'd внутри класса MarkerSampler.

Если вы явно указали область действия typedef, это должно исправить ошибку. Хотя (в зависимости, по крайней мере, от вашего компилятора) вам может потребоваться добавить ключевое слово typename, поскольку MarkerSetVector является зависимым типом. Вот фиксированный пример:

template <class MarkerT>
typename MarkerSampler< MarkerT >::MarkerSetVector MarkerSampler<MarkerT>::sample2(const double scaleFactor, const double noiseSD)
{
....
}
...