2015-08-19 20 views
5

Şablon kullanarak herhangi bir nesneyi kabul etmek için bir işlevde bir paremeter değiştirdim ancak diğer varsayılan parametrelerle birlikte kullanamıyorum, eksik bir şey var mı?Neden şablon ve varsayılan argümanlara sahip değilim?

#include <string> 
#include <iostream> 

class MyClass { 
    public: 
    std::wstring msg = L"hey"; 
    MyClass(){}; 
}; 

class MyClass2{ 
    public: 
    template<class T> MyClass2(T* t, int i); 
}; 
template<class T> 
MyClass2::MyClass2(T* t,int i=0){ std::wcout << t->msg << std::endl; } 

int main(int argc, char **argv) 
{ 
    MyClass mc; 
    MyClass2 mc2(&mc); 
    return 0; 
} 

Çıktı:

practice.cpp:16:32: error: redeclaration of 'MyClass2::MyClass2(T*, int)' may not have default arguments [-fpermissive] 

Ben şablonda varsayılan değerleri kullanmamaya makul ama diğer parametreler için bir neden yoktur düşündü?

cevap

17

Kesinlikle can; Tanımlamadaki varsayılan argümanı, tanımı değil. deklarasyon en yerine tanımının argüman listesindeki varsayılan koyarak

fonksiyon şablonları için kullanılabilir olmadığını eklenen bir ekstra: şablon olmayan işlevler için

[C++14: 8.3.6/4]:, varsayılan argümanlar sonraki beyanlarında eklenebilir aynı kapsamdaki bir fonksiyonun. [..]

bu kısıtlama yerinde olduğundan Gerçekten neden bilmiyorum.

Benzer kural: Sınıf şablonları üye fonksiyonları hariç

[C++14: 8.3.6/6]:, üye işlevi tarafından sağlanan varsayılan argümanlar kümesine eklenir sınıf tanımının dışında görünen bir üye işlev tanımında varsayılan argümanlar sınıf tanımındaki bildirim [..]

İlgili konular