模板和铸造操作员

Jon*_*ney 4 c++ templates casting operator-overloading

此代码在CodeGear 2009和Visual Studio 2010中编译,但不在gcc中编译.为什么?

class Foo
{
public:
    operator int() const;

    template <typename T> T get() const { return this->operator T(); }
};

Foo::operator int() const
{
    return 5;
}
Run Code Online (Sandbox Code Playgroud)

错误消息是:

test.cpp:在成员函数`T Foo :: get()const':
test.cpp:6:错误:'const class Foo'没有名为'operator T'的成员

Joh*_*itb 9

这是G ++中的一个错误.operator T是一个不合格的依赖名称(因为它T在其中,因此查找将根据其类型而不同).因此,必须在实例化时查找它.标准规则

两个名字是相同的,如果

  • ...
  • 它们是由相同类型形成的用户定义转换函数的名称.

因此,在operator关键字之后指定的类型名称不必以任何方式词汇匹配.您可以应用以下解决方法强制GCC将其视为依赖名称

template<typename T, typename>
struct identity { typedef T type; };

class Foo
{
public:
    operator int() const;

    template <typename T> T get() const { 
      return this->identity<Foo, T>::type::operator T(); 
    }
};
Run Code Online (Sandbox Code Playgroud)