Podczas czytania this question znalazłem dziwny punkt:C++ przy użyciu deklaracji z TypeName w dziedziczących-konstruktorów
template <typename T>
class Subclass : public Baseclass<T>
{
public:
using typename Baseclass<T>::Baseclass;
// ^^^^^^^^
};
Od typename
, Baseclass<T>::Baseclass
powinny być injected class name, a nie konstruktor. O ile mi wiadomo, jest to ten sam przypadek:
template <typename T>
class Base
{
public:
typedef short some_type;
};
template <typename T>
class Sub : public Base<T>
{
public:
using typename Base<T>::some_type;
};
Aby się upewnić, napisałem kod testowy.
#include <iostream>
template <typename T>
class Base
{
public:
Base() { std::cout << "A::A()\n"; }
Base(int) { std::cout << "A::A(int)\n"; }
Base(const char *) { std::cout << "A::A(const char *)\n"; }
};
template <typename T>
class Sub : public Base<T>
{
using typename Base<T>::Base;
};
int main()
{
Sub<char> s1;
Sub<char> s2(3);
Sub<char> s3("asdf");
}
Jednak działa na gcc 4.8.3. To jest również bez
$ cat test.cpp
...
using Base<T>::Base;
...
$ g++ -std=c++1y -Wall -Wextra -Werror -pedantic test.cpp -o test && ./test
A::A()
A::A(int)
A::A(const char *)
Dlaczego otrzymałem te wyniki? Co mnie ominęło?
dzyń ++ odrzuca ' typename ". – dyp
Za bardzo dbałem o to, by moja zdrowa psychika mogła odpowiedzieć na to pytanie w innym pytaniu ... Standard mówi w [namespace.udecl]/1 "Jeśli * using-declaration * nazywa konstruktor, domyślnie deklaruje zestaw konstruktorów w klasa, w której pojawia się * use-declaration *, w przeciwnym razie nazwa podana w * use-declaration * jest synonimem nazwy jakiegoś encji zadeklarowanej gdzie indziej. " Ale w [klasa.ktor]/1 "Konstruktory nie mają nazw." – dyp
Należy zauważyć, że istnieje [przestrzeń nazw.udecl]/20 "Jeśli * using-declaration * używa słowa kluczowego' typename' i określa zależną nazwę, nazwa wprowadzona przez * using-declaration * jest traktowana jako * typedef-name *. " – dyp