Thread overview
C++ - does not match any template declaration Hatası
Jan 17, 2017
İbrahim
Jan 17, 2017
İbrahim
Jan 18, 2017
İbrahim
Jan 18, 2017
İbrahim
January 17, 2017

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.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 18, 2017

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.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 18, 2017

Embarcadero C++ Builder'da bir deneme yaptım, GCC ile çalışan kod bunda şöyle bir hata verdi: '[b]c32c 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 :)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 18, 2017

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.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 17, 2017

Ş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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 18, 2017

Ç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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]