2011-02-11 12 views
11

Bir işlev işaretçisini bir şablon işlevine depolayan bir şablon sınıfı oluşturmaya çalışıyorum ancak Visual Studio 2008'de bir derleme hatası oluşturdum. Basitleştirilmiş bir test durumu oluşturdum Bunun için hala VS2008'de derlenemeyen, fakat denediğim çevrimiçi Comeau ve çevrimiçi GCC derleyicileri üzerinde başarılı bir şekilde derlemiş görünen (aşağıya bakınız).Visual Studio 2008'de işaretçiye şablon işleviyle hata derleme

görüyorum hatadır:

error C2436: 'func' : member function or nested class in constructor initializer list 
temp.cpp(21) : while compiling class template member function 'test_class<T>::test_class(T (__cdecl &))' 
1>  with 
1>  [ 
1>   T=int (const int &) 
1>  ] 

fonksiyon çalışır olmayan bir şablonu kullanarak aynı test. Kısacası, herkes sorun için bir çözüm biliyor mu, yoksa VS2008 bunun için bir çeşit farklı sözdizimi bekliyorsa?

sayesinde

Jerry

template<class T> 
T template_function(const T& arg) 
{ 
    return arg; 
} 

int non_template_function(const int& arg) 
{ 
    return arg; 
} 

template<class T> 
class test_class 
{ 
public: 
    test_class(const T& arg) : func(arg) {} 
private: 
    T func; 
}; 

template<class T> 
void create_class(const T& arg) 
{ 
new test_class<T>(arg); 
} 

int main() 
{ 
    create_class(&template_function<int>); //compile fails unless this is commented out 
    create_class(&non_template_function); 
    return 0; 
} 
+0

+1. Yetkili olarak cevaplanamaz ama hata mesajında ​​__cdecl, bağlantılarla ilgili olarak alarm zillerini çalar. – Flexo

cevap

0

Test_class'ta "const T & arg" gibi görünüyor ve create_class sizin sorununuz. Bunları basit bir "T arg" ile değiştirmek, işleri düzeltir gibi görünüyor. Soru için iyi yazılmış, güzel ve minimal bir çalışma örneği olan

+0

Aynen öyle, teşekkürler! Şablon işleviyle niçin tempize edilmezse, şablon işlevi başarısız olur, ancak bu değişiklikle her ikisi için de çalışır. – Jerry

+0

Aynı probleme girdi ve bu cevap çözüldü. Teşekkürler! –

1

aslında sen başlatılıyor yerine o fonksiyonu çağırmak için çalışıyoruz düşündüğü için bir derleyici hata gibi görünüyor.

VS C++ derleyici yok, ama bir işaretçi olarak T ilan soruna edilebilir: iki yerde

template<class T> 
class test_class 
{ 
public: 
    test_class(const T& arg) : 
     func(&arg) 
    { 
    } 

private: 
    T *func; 
}; 


template<class T> 
void create_class(const T& arg) 
{ 
    new test_class<T>(arg); 
} 

int main() 
{ 
    create_class(template_function<int>); //compile fails unless this is commented out 
    create_class(non_template_function); 
} 
2

saptamak;

T* func; //make this pointer type! 

ve

create_class(template_function<int>); //remove '&' 
create_class(non_template_function); //remove '&' 

Bitti!