neden aşağıdaki vermek hiçbir derleme hatası ?: sadece sessizce derleyici tarafından göz ardı edilir sankiSınıf şablon üyesi işlevi için "varsayılan parametre hatasının yeniden tanımlanması" yok mu?
// T.h
template<class T> class X
{
public:
void foo(int a = 42);
};
// Main.cpp
#include "T.h"
#include <iostream>
template<class T> void X<T>::foo(int a = 13)
{
std::cout << a << std::endl;
}
int main()
{
X<int> x;
x.foo(); // prints 42
}
görünüyor. Bu neden?
Sınıf şablonu tanımı, bir başlık dosyası yerine Main.cpp içeriyorsa, gerçekten varsayılan parametre hatasını yeniden tanımlıyorum.
Artık derleyici, sıradan (şablonsuz) bir işlev olsaydı bu konuda şikayette bulunacağını biliyorum.
Sınıf şablonu üye işlevlerinde veya işlev şablonlarında standart varsayılan parametreler hakkında ne söylemelidir? 8.3.6 §6 sınıfında üye işlev bildiriminde tarafından sağlanan varsayılan argümanlar kümesine eklenir sınıf tanımının dışında görünen üye işlev tanımında varsayılan argümanlar
g ++ * * bir derleme ile derlemeyi iptal eder. – sth
"... şablon bildirimi içeriyorsa ..." derken, sınıf şablonu tanımını yani 'şablon sınıf x {....}; Öyleyse, bu şablon sınıfı tanımıyla include yönergesini değiştirmenin farklı bir derleyici mesajı oluşturduğunu mu söylüyorsunuz? Bu, başlık dosyasında başka bir şey olduğunu gösterir, yani başlık dosyasının tüm içeriklerini içerme yönergesinin olduğu yere kopyalamayı deneyin ve muhtemelen derleyici uyarısı almazsınız? –
Troubadour
Bir şekilde bu VC++ hatası ile ilgili olabilir: https://connect.microsoft.com/VisualStudio/feedback/details/496593/msdn-forum-splitting-templated-function-with-default-argument-into-declaration-definition -gives-derleme hatası –