2012-10-01 20 views
10

私は、テンプレートのコードの一部は、もはや私は、最小限の例を蒸留している2012年に動作するテンプレートメタプログラミングの重い利用してプロジェクトを継承していない、と2012年にVisual Studioの2010からのアップグレードの過程で今の私している:なぜこのテンプレートコードはVS2010では動作しますが、VS2012では動作しませんか?

MyClassでダウンさらに

source.cpp(5): error C2059: syntax error : '<' 
    source.cpp(6) : see reference to class template instantiation 'MyClass<T,i>' being compiled 
    source.cpp(5): error C2238: unexpected token(s) preceding ';' 

、私はそれだけでは動作しませんtypedefで、T::Nested<i>を使用することができます。

template <typename T, int i> 
class MyClass 
{ 
private: 
    typedef typename T::Nested<i> Found; 
}; 

は、このエラーメッセージを表示します。

この例は、2010年にコンパイルしますが、2012年には、このコードが間違っているではありませんか?

+7

ない100%(したがってない答え)が、私はあなたが 'template'が欠落していると信じて:' typedefの型名T ::テンプレート入れ子の発見; 'または同様の何か。 –

+1

Davidの情報に追加するだけで、常にVisual C++テンプレートコードをg ++に公開することをお勧めします。そして一般に、コードを少なくとも2つの異なるコンパイラでコンパイルするようにします。昔は本当に真面目だった人々がComeauを使っていましたが、もっと完全なC++ 11準拠に更新されたかどうかはわかりません。 –

+1

+1最小限のテストケース。 – Puppy

答えて

12

各VSバージョンはtemplatetypenameを必要約ますます厳格です。あなたはtemplateがありません。そしてVS2012は不平を言う権利があります。

+0

+1を短く簡潔に –

+1

どこを指しているのでしょうか。 (コンパイラはテンプレートがインスタンス化されるまで 'T :: Nested'がテンプレートであると推測することができないので、' Nested'の前に) – MSalters

関連する問題