Во время чтения this question, я обнаружил странную точку:C++ с использованием декларации с TypeName в наследующих-конструкторах
template <typename T>
class Subclass : public Baseclass<T>
{
public:
using typename Baseclass<T>::Baseclass;
// ^^^^^^^^
};
typename
С, Baseclass<T>::Baseclass
должен быть injected class name, не конструктор. Насколько мне известно, это тот же случай:
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;
};
Чтобы убедиться, что я написал тестовый код.
#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");
}
Однако, он работает на gcc 4.8.3.
$ g++ -std=c++1y -Wall -Wextra -Werror -pedantic test.cpp -o test && ./test
A::A()
A::A(int)
A::A(const char *)
Он также работает без typename
.
$ 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 *)
Почему я получу эти результаты? Что я упустил?
лязг ++ отвергает ' typename'. – dyp
Я слишком заботился о своем здравомыслии, чтобы ответить на этот вопрос по другому вопросу ... Стандарт говорит в [namespace.udecl]/1 «Если * use-declaration * указывает на конструктор, он неявно объявляет набор конструкторов в класс, в котором появляется выражение * using-declaration *, в противном случае имя, указанное в * using-declaration *, является синонимом имени какого-либо объекта, объявленного в другом месте. " Но в [class.ctor]/1 «Конструкторы не имеют имен». – dyp
Обратите внимание, что существует [пространство имен.udecl]/20 "Если * using-declaration * использует ключевое слово' typename' и указывает зависимое имя, имя, введенное с помощью * using-declaration *, рассматривается как * typedef-name *. " – dyp