C ++:奇怪的遗失';'错误之前,由于模板化类中的typedef'ed返回类型

时间:2012-03-14 13:24:01

标签: c++ templates compiler-errors typedef

构建以下测试代码时,我遇到了一个非常令人困惑的编译器错误。

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而另一个使用了typdef的版本。

.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文件

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 个答案:

答案 0 :(得分:5)

失踪;该错误的一部分有点误导,编译器实际上只是不识别MarkerSetVector类型。我认为这是因为它在MarkerSampler类中的typedef。

如果你明确说明了typedef的范围,它应该修复错误。虽然(至少取决于您的编译器),您可能还需要添加typename关键字,因为MarkerSetVector是依赖类型。这是一个固定的例子:

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