2014-10-24 10 views
5

mam ochoty mieć klasy, który wygląda tak:Czy klasa może mieć szablonowy konstruktor bez argumentów?

template <typename T> 
class foo 
{ 
    public: 
    template <typename S> 
    foo() 
    { 
     //... 
    } 
}; 

ale nie mogę dowiedzieć się, jak wywołać konstruktor. Oczywiście mogę wykonać tę pracę, podając foo() argument typu S, ale czy można to zrobić bez żadnych argumentów?

--Ron

+1

http://stackoverflow.com/questions/26553803/derive- from-constuctor-conplate -top-base -class – 0x499602D2

Odpowiedz

3

Nie można przekazywać argumenty szablonu wyraźnie na szablonie konstruktora. Konstruktory nie mają nazw.

[Uwaga: Ponieważ lista jawne szablon argumentem następuje funkcyjnego nazwę szablonu, a ponieważ funkcja członek konwersja szablony i szablony funkcji członka konstruktor nazywa bez używając nazwy funkcji, nie ma sposobu, aby udostępnienie jawnej listy szablonów dla tych szablonów funkcji. - koniec uwaga]

Chociaż można nazwać konstruktora przy użyciu składni foo<int>::foo, może być stosowane tylko w taki sposób, że nie mają jakiegokolwiek zainteresowania tutaj:

W odnośnika w którym konstruktor jest akceptowalny wynik wyszukiwania, i zagnieżdżone nazwa-specyfikator wyznacza klasę C:
- gdy nazwa określono po zagnieżdżone-nAME specyfikatora, gdy ogląda się C, jest wtryskowo klasy nazwa C (Rozdział 9) lub
- [...]
nazwa jest uważana zamiast wymienić konstruktora klasy C. [...] Taka nazwa konstruktora: może być używana tylko w -deklaratorze-identyfikatorze deklaracji, która nazywa konstruktora lub w deklaracji użycia .

+0

"Nie można pięciu szablonów argumentów do szablonu konstruktora": Fałsz. Zobacz konstruktor wektora, który można zainicjować za pomocą pary iteratorów. Zobacz (4) na http://en.cppreference.com/w/cpp/container/vector/vector – Notinlist

+2

Nie można przekazać argumentów szablonu ** jawnie ** do szablonu konstruktora. Konstruktory mogą być szablonowe, ale wszystkie argumenty szablonów muszą zostać wywnioskowane. –

+0

@BenVoigt Zobacz moją odpowiedź. – Notinlist

1

To działa na mnie na gcc 4.4.5 (Debian 4.4.5-3)

template<typename T> 
class A 
{ 
public: 
    template<typename U> 
    A() 
     : t(U()) 
    { } 
private: 
    T t; 
}; 

int main() 
{ 
    using namespace std; 
    A<float> a(A<float>::A<int>()); 
    return 0; 
} 

Zestawione z g++ -W -Wall -Wextra -pedantic tc.cpp -o tc, bez ostrzeżenia.

UPDATE: To rozwiązanie jest błędne. Zostało to wyjaśnione w komentarzach. Uważam to za przydatne złe rozwiązanie i chciałbym go tutaj zatrzymać. Proszę nie odrzucaj, ponieważ wtedy będę musiał go usunąć. Mam nadzieję, że to zadziała. Twoje zdrowie!

+1

Właściwie to, co robisz [nawet nie powinno się kompilować] (http://ideone.com/AJ90Rz) ... brzmi jak buggy g ++. – cdhowie

+2

Lol. 'A :: A ' jest równoważne 'A '. Sprawdź to za pomocą 'std :: is_same'. ;) – Columbo

+0

Lista jawnych argumentów podąża za nazwą szablonu, ale ** "Konstruktorzy nie mają nazw." **. –

Powiązane problemy