我想允许通过指定策略来修改我的类的行为。该策略应该用作boost :: variant的访问者。默认策略适合大多数情况良好,但用户可能需要添加或替换一些重载。
我发现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 此exaple适用于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;
}
答案 0 :(得分:2)
代码格式正确。 7.3.3 / 15:
当 using-declaration 将基类中的名称带入派生类范围时,派生类中的成员函数和成员函数模板会覆盖和/或隐藏成员函数和成员函数模板。基类中的同名,参数类型列表(8.3.5),cv-qualification和 ref-qualifier (如果有)(而不是冲突)。
因此UserModifiedPolicy::operator()(int)
仍应隐藏DefaultPolicy::operator()(int)
。 operator()
的名称查找应该找到三个成员DefaultPolicy::operator()(bool)
,UserModifiedPolicy::operator()(int)
和UserModifiedPolicy::operator()(float)
。