VC ++ 2013:使用声明+重新定义成员函数会导致编译错误

时间:2014-06-25 12:56:54

标签: c++ visual-c++-2013

我想允许通过指定策略来​​修改我的类的行为。该策略应该用作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;
}

1 个答案:

答案 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)