2012-03-14 14 views
1

次のテストコードをビルドするときに非常に混乱しているコンパイラエラーが発生します。C++:strange missing ';'テンプレートクラスの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 

サンプルはエラーなしでビルドされますが、サンプル2は問題の原因です。唯一異なるのは、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) 
{ 
.... 
} 
+0

ベクトルをクラス定義内で初期化することはできませんが、コンストラクタでそれを行う必要があります。ベクタ宣言を修正するとどうなりますか? –

+0

申し訳ありませんが、私はあなたとはあまり関係ありません。あなたが間違っていると思う行を指摘できますか。 – oracle3001

+0

私は 'sample'と' sample2'について話しています。クラス定義では宣言することしかできませんが、それらを初期化します(カッコ内のもの)。 –

答えて

5

不足しています。そのエラーの一部はやや誤解を招きますが、コンパイラは実際にはMarkerSetVector型を認識しません。これは、MarkerSamplerクラスの中にtypedefされているからです。

typedefのスコープを明示的に指定すると、エラーを修正するはずです。 MarkerSetVectorは依存型なので、(少なくともあなたのコンパイラによっては)typenameキーワードを追加する必要があります。ここに固定の例があります:

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

ニース - 私はちょうどそれを入力していた(しかし、::の前にを見逃していただろう。 –

+0

ありがとうございます。それはトリックをしたようだ。 – oracle3001

+3

完全性のために:標準は、関数への引数が定義されているメソッドのクラスのスコープ内にあると述べていますが、**戻り型はありません。つまり、引数型として使用できる場合でも、修飾されていない 'MarkerSetVector'を戻り値の型として使用することはできません。さて、C++ 11では、戻り値の型を式の最後まで延期することができます。クラスのスコープは既に入力されており、修飾を避けています(私はこれを避けるため混乱しています):template auto MarkerSampler :: sample2(...) - > MarkerSetVector {...} '戻り値はクラスのスコープ内にあります。 –

関連する問題