2012-10-01 10 views
10

Şablon meta programlamadan yoğun bir şekilde yararlanan bir projeyi miras aldım ve şu anda Visual Studio 2010'dan 2012'ye yükseltme işlemindeyim. Şablon kodunun bir kısmı artık 2012'de çalışmamaktadır. En az bir örneği distile ettim:Bu şablon kodu neden VS2010'da çalışıyor, ancak VS2012'de çalışmıyor?

MyClass aşağı Dahası

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 ';' 

, ben sadece çalışmıyor typedef olduğunu T::Nested<i> kullanabilirsiniz:

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

bu hata mesajını verir.

Bu örnek, 2010'da derlenmiştir, ancak 2012'de değil. Bu kodun nesi yanlış?

+7

% 100 değil (bu yüzden bir yanıt değil) ama bir "şablon" un eksik olduğuna inanıyorum: "typedef typename T :: template Nested Bulundu" veya benzer bir şey. –

+1

Sadece David'in bilgisine ekleyerek, Visual C++ şablon kodunu g ++ 'ye çıkarmak her zaman iyi bir fikirdir. Ve genel olarak, kodu en az iki farklı derleyiciyle derlemek. Eskiden bu günlerde gerçekten çok ciddi olan insanlar Comeau'yu kullandılar, fakat daha fazla C++ 11 uyumluluğuna güncellendiğinden emin değilim. Minimum test durumu için –

+1

+1. Kısa ve özlü – Puppy

cevap

12

Her VS sürümü, template ve typename gereksinimlerini gerektirme konusunda daha katıdır. Bir template eksik ve VS2012 şikayet etmek doğru.

+0

+1 için –

+1

Nereye dikkat çekebilirsiniz. ('Nested''ten önce, derleyici, şablonun örneği oluşturuluncaya kadar "T :: Nested" in bir şablon olduğunu tahmin edemez) – MSalters

İlgili konular