2011-12-23 11 views
11

(Microsoft Visual C++ 2005 Express) kod parçası derleme:X türünden x türüne dönüştürülemiyor?

'=': cannot convert from 'A (__cdecl *)(void)' to 'A (__cdecl *)(void)'

bana mantıklı değildir:

struct A 
{ 
    template< typename T > static A Foo(void) { return A(); } 
    struct S 
    { 
     template< typename T > static S GetInstance(void) 
     { 
      S Result; 
      Result.m_funcFoo = &A::Foo<T>; 
      return Result; 
     } 
     A (*m_funcFoo)(void); 
    }; 
}; 

int main(int argc, char* argv[]) 
{ 
    A::S::GetInstance<int>(); 
} 

Bir C2440 hatası alıyorum. Hata metninde adlandırılan iki tür açıkça aynıdır. Ayrıca, Foo'un dönüş değeri int olarak değiştirilirken, böyle bir hata yoktur.

Hata mı, yoksa yanlış bir şey mi yapıyorum?

DÜZENLEME: Yani, eğer bir hata varsa, bunu nasıl çözeceğini bilen var mı? Belki de oyuncular kullanarak? Derlemek için bu kod gerekiyor ...

+4

Onun bir hata! [....] –

+0

İlk başta, '* A (A :: *) (void)' 'farklı * A (*) (void)' yüzünden olduğunu düşündü ama Bunu böyle yapamazdım. – Griwes

cevap

4

Bu bir derleyici hatasıdır. VC++ çok garip bir şey yapıyor.

Örneğin, bu çok farklı bir hata mesajı oluşturur:

struct A 
{ 
    template< typename T > static struct A Foo(void) { return A(); } 
    struct S 
    { 
     template< typename T > static S GetInstance(void) 
     { 
      S Result; 
      Result.m_funcFoo = &A::Foo<T>; 
      return Result; 
     } 
     A (*m_funcFoo)(void); 
    }; 
}; 

sourceFile.cpp(5) : error C3856: 'A::Foo': class is not a class template 

Ve bu işleri:

struct X {}; 

struct A 
{ 
    template< typename T > static X Foo(void) { return X(); } 
    struct S 
    { 
     template< typename T > static S GetInstance(void) 
     { 
      S Result; 
      Result.m_funcFoo = &A::Foo<T>; 
      return Result; 
     } 
     X (*m_funcFoo)(void); 
    }; 
}; 

Açıkça temel sınıf başvurmalıdır adıyla A, karıştı yok oluyor.

Bir yazım hatası eklemek yardımcı olmadı, struct A iletme bildirimi de yapılmadı, ayrıca ::A veya struct A olarak adlandırılıyor.

Garip bir şekilde, VC++ 7 onu derliyor.

Çözüm: şöyle değiştirme:

struct A 
{ 
    template< typename T > static A Foo(void) { return A(); } 

    struct S; 
}; 

struct A::S 
{ 
    template< typename T > static S GetInstance(void) 
    { 
     S Result; 
     Result.m_funcFoo = &A::Foo<T>; 
     return Result; 
    } 
    A (*m_funcFoo)(void); 
}; 

sonucu, şimdi VC++ 8 Tamam derler ve VC++ 7 aynı hata iletisini oluşturur tersine çevirir.

Tamamlanmamış türde ve tamamlandıktan sonra aynı tür arasında bir tür kimlik sorunu olduğunu düşünüyorum.

Bütün testler aşağı sorunu izlemek için çalıştı ve şimdi garip hata üretmek templated işlevleri veya iç içe yapılar olması bile gerekmez gibi görünüyor Dinkumware Multi-Compiler Test Tool

1

Derleyici bir hata olup olmadığından emin değilim, ancak en azından msdn belgelenmiştir.
Ben el altında 2005 derleyici yok ama bu gibi yazmak eğer VS2010 kodunuzu derler:

struct A 
{ 
    template< typename T > static A Foo(void) { return A(); } 
    struct S 
    { 
     A (*m_funcFoo)(void);  

     template< typename T > static S GetInstance(void); 
    }; 
}; 

template< typename T > 
A::S A::S::GetInstance(void) 
{ 
    S Result; 
    Result.m_funcFoo = &A::Foo<T>; 
    return Result; 
} 
+0

Oh, MSDN bağlantısı Almanca'dır. – fefe

+0

@fefe artık öyle değil o aslında (diyerek örneğin) 'A :: S :: GetInstance' örneğini mı – AakashM

+0

@mkaes değil mi? Kodunuzu hem VS2005 hem de VS2010'da test ettim - hala aynı hata. – Baltram

0

kullanarak çalıştırın.

struct A 
{ 
    typedef A (* SimpleFuncPtr)(void); 
    static void Foo(void) 
    { 
     SimpleFuncPtr func1 = 0;  // Ok. 
     SimpleFuncPtr func2 = func1; // Ok. 
     A (* func3)(void) = func1; // C2440 on both VS2005 and VS2010 
    } 
}; 

Yukarıdaki kod parçasına bakarak, bunun gerçekten derleyici bir hata olduğunu düşünüyorum (bence).

+0

sorun tam olmayan tip ve mkaes tarafından sağlanan bağlantı tarif edilmektedir (örneğin, tip derleyici tam tür tanımlandığı zaman, daha sonra değiştirileceğini Belirli bir arama kuralı seçer işlev işaretçisi tanımının zamanda eksik olduğu için) –