Forum: Diğer Konular RSS
C++ - does not match any template declaration Hatası
İbrahim #1
Üye Eki 2015 tarihinden beri · 126 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: C++ - does not match any template declaration Hatası
Selamün Aleyküm;

Şöyle bir kodum var:
class Example
{
public:
  template<typename T>
  static void callMethod(const T val);
};
 
template<>
void Example::callMethod<int>(const int val)
{
  cout << "Integer = " << val << endl;
}
 
template<>
void Example::callMethod<float>(const float val)
{
  cout << "Float = " << val << endl;
}
 
template<>
void Example::callMethod<char*>(const char* val)
{
  cout << "Char* = " << val << endl;
}
 
int main()
{
  Example::callMethod<int>(17);
  Example::callMethod<float>(3.8);
  Example::callMethod<char*>("Hello");
 
  return 0;
}

Bu kodu çalıştırdığımda şöyle bir hata alıyorum:
template-id ‘callMethod<char*>’ for ‘void Example::callMethod(const char*)’ does not match any template declaration
Bunun tam olarak sebebi nedir? Teşekkürler.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Şablon, şöyle tanımlanmış: "özellemesi T ise const T alır." Yani, int ise const int alır.

Sorunlu durumda T 'char*'. 'char*'ın const olanı 'char * const'tır. Yani, char gösteren ama kendisi const olan gösterge... O özellemenin parametresini 'char * const' olarak değiştirince derlenir. (Ama yine de mantık olarak bozuktur çünkü "Hello" gibi hazır dizgilerin elemanlarının türü const char'dır, char değil. O yüzden aslında T 'const char*' ve parametre 'const char * const' olmalı.)

O düzeltemeden sonra benim derleyicim bir de 3.8'in float değil, double olduğu konusunda uyarı verdi.

Ali
İbrahim #3
Üye Eki 2015 tarihinden beri · 126 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler;
Parametreyi şu şekilde değiştirdiğimde kod çalıştı:
template<>
void Example::callMethod<char*>(char* const val)
{
  cout << "Char* = " << val << endl;
}

Fakat şu şekilde çalışmadı, aynı hatayı verdi:
template<>
void Example::callMethod<char*>(const char* const val)
{
  cout << "Char* = " << val << endl;
}
Ben GCC 5.4.0 kullanıyorum, onda Float hatası vermedi ve aynı şekilde Embarcadero C++ Builder'da da hata almadım.
İbrahim #4
Üye Eki 2015 tarihinden beri · 126 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Embarcadero C++ Builder'da bir deneme yaptım, GCC ile çalışan kod bunda şöyle bir hata verdi: [bcc32c Error] File1.cpp(8): static member function cannot have 'const' qualifier
Statik üye fonksiyonda const belirtecini kabul etmiyor, kaldırınca çalışıyor tabii. Fakat derleyiciler arasındaki bu gibi temel şeylerde farkların olmaması gerekir diye düşünüyorum. Standartlara uymuyorlar :)
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Çalışmayan şablonda türler uymamış: Şablon tanımındaki T ise parametre tanımında 'const T' olacak demişiz ama son denediğinde şöyle: 'char*' ve 'const char* const'. Uymuyor, değil mi? Eğer parametre 'const char* const' olacaksa, T'nin 'const char*' olması gerekir.

float konusundaki uyarıyı '-Werror' derleyici seçeneğini kullanmış olduğum için aldım. (Özellikle bu deneme için yazmamıştım; kullandığım deneme Makefile'ın içinde zaten vardı. Uyarı seçeneklerinden yararlanmak gerek. :) )  Tam hata mesajı şuydu:

error: conversion to ‘float’ alters ‘double’ constant value [-Werror=float-conversion]

(Bu arada, 3.8 gibi hazır değerlerin türü double'dır. float istediğini belirtmek istersen 3.8f veya 3.8F yazmalısın.)

"Hello" gibi hazır değerlerin char* gibi göstergelere atanmasının yanlış olduğu uyarısını da sanırım '-pedantic' ile alıyorsun.

Derleyiciler arasında farklılıklar oluyor ama Embarcadero'nun o hatayı vermesi için template bildiriminden sonra, noktalı virgülden önce bir const daha eklemiş olmalısın. Derleyici haklı: static işlevler gizli 'this' göstergesi almazlar ve dolayısıyla "üyeleri değiştirmeme sözü veriyorum" anlamında o ek const'ın anlamı olamaz.

Ali
İbrahim #6
Üye Eki 2015 tarihinden beri · 126 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Evet, teşekkürler. Ben başta eklediğim kodda üye verileri değiştiremez diye fonksiyonu const yaptım zannetmişim :).
Asıl kodumda const vardı, yani şöyle idi: static void callFunction(const T value) const; Sonda bulunan, yani fonksiyonun herhangi bir üye veriyi değiştiremeyeceğini gösteren const'da o hatayı vermişti.

Tekrardan teşekkürler.
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-03-22, 15:17:44 (UTC -07:00)