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

ora*_*001 1 c++ templates typedef compiler-errors

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

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
Run Code Online (Sandbox Code Playgroud)

注意样本构建没有错误,但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
Run Code Online (Sandbox Code Playgroud)

.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)
{
....
}
Run Code Online (Sandbox Code Playgroud)

obm*_*arg 5

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

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

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

  • 为了完整性:标准规定函数的参数在被定义的方法的类的范围内,**但**返回类型不是.也就是说,即使您可以将其用作参数类型,也不能将非限定的`MarkerSetVector`用作返回类型.现在,在C++ 11中,您可以将返回类型推迟到表达式的末尾,其中已经输入了类的范围并避免限定(我发现这令人困惑所以我会避免它):`template <type T > auto MarkerSampler <T> :: sample2(...) - > MarkerSetVector {...}`现在返回属于类的范围. (3认同)