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'的成员
这是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)