VC ++ 2013: использование-объявление + переопределение функции-члена приводит к ошибке компиляции

Я хочу разрешить изменять поведение моего класса, указав политику. Эта политика должна использоваться в качестве посетителя для boost :: option. Существует политика по умолчанию, которая подходит для большинства случаев, но пользователю может потребоваться добавить или заменить некоторые перегрузки.

Я обнаружил, что vc ++ 2013 не компилирует этот код с ошибкой C3066: there are multiple ways that an object of this type can be called with these arguments, Тот же код компилируется и работает как положено в gcc и clang.

Это ошибка vc ++ 2013?

#include <iostream>

struct DefaultPolicy
{
void operator()( bool ) { std::cout << "Base: bool" << std::endl; }
void operator()( int ) { std::cout << "Base: int" << std::endl; }
};

struct UserModifiedPolicy : public DefaultPolicy
{
using DefaultPolicy::operator();
void operator()( int ) { std::cout << "Derived: int" << std::endl; }
void operator()( float ) { std::cout << "Derived: float" << std::endl; }
};

int main()
{
UserModifiedPolicy()(true);
UserModifiedPolicy()(1); // <-- ERROR HERE
UserModifiedPolicy()(1.f);
return 0;
}

UPD Этот пример работает в vc ++ 2010. Похоже, это ошибка в версии 2013 года.


UPD Временное решение

#include <iostream>

struct DefaultPolicy
{
void operator()( bool ) { std::cout << "Base: bool" << std::endl; }
void operator()( int ) { std::cout << "Base: int" << std::endl; }
};

struct UserModifiedPolicy : public DefaultPolicy
{
// Using template to forward a call to the base class:
template< class T >
void operator()( T && t ) { DefaultPolicy::operator()( std::forward<T>(t) ); }

void operator()( int ) { std::cout << "Derived: int" << std::endl; }
void operator()( float ) { std::cout << "Derived: float" << std::endl; }
};

int main()
{
UserModifiedPolicy()(true);
UserModifiedPolicy()(1);
UserModifiedPolicy()(1.f);
return 0;
}

4

Решение

Код правильно сформирован. 7.3.3 / 15:

Когда используя декларирование приносит имена из базового класса в область производного класса, функции-члены и шаблоны функций-членов в производном классе переопределяют и / или скрывают функции-члены и шаблоны функций-членов с одинаковыми именами, параметр-тип-список (8.3.5), cv -квалификация и реф-классификатор (если таковые имеются) в базовом классе (а не конфликтующие).

Так UserModifiedPolicy::operator()(int) должен еще спрятаться DefaultPolicy::operator()(int), И название поиска для operator() должен найти трех членов DefaultPolicy::operator()(bool), UserModifiedPolicy::operator()(int), а также UserModifiedPolicy::operator()(float),

2

Другие решения


По вопросам рекламы [email protected]