VC++类模板使用typedef类型实现函数

ExO*_*fDe 0 c++ templates visual-c++

我现在有一些奇怪的事情发生了.我正在尝试使用VC++编译器编写模板类.

在我的课堂上,为了清晰起见,我得到了一些typedef.我头文件之外的实际实现

template<typename T,
    typename = typename std::enable_if<std::is_arithmetic<T>::value,T>::type>
class Integer
{
public:
    typedef  T                      value_type;
    typedef  Integer < value_type > Self;
    typedef  Self&                  SelfReference;
    typedef  Self*                  SelfRawPointer;
    ...
public:
    SelfReference operator =(const SelfReference);
Run Code Online (Sandbox Code Playgroud)

*.tcc - 文件:

...
template<typename T> Integer<T>::SelfReference Integer<T>::operator =(const 
Integer<T>::SelfReference rhs)
{
    return this->assign(rhs);
};
...
Run Code Online (Sandbox Code Playgroud)

使用gcc过去我没有任何问题这样做,但现在在Windows上,编译器抱怨'SelfReference':C2061:语法错误:标识符'SelfReference'

我不知道出了什么问题,因为过去使用的gcc ...我错过了什么吗?如果我将函数内联编写,则不会出现此问题.我现在只是好奇为什么在Windows上我遇到了这样的问题!

And*_*rew 5

SelfReference是一种依赖类型,因此您需要使用typename:

template <typename T>
typename Integer<T>::SelfReference Integer<T>::operator=(const typename Integer<T>::SelfReference rhs) { blah; }
Run Code Online (Sandbox Code Playgroud)

Integer<T>::你的右边也可以使用SelfReference,即.

template <typename T>
typename Integer<T>::SelfReference Integer<T>::operator=(const SelfReference rhs) { blah; }
Run Code Online (Sandbox Code Playgroud)

这是autoc ++ 11中返回值的部分原因,您现在可以编写

template <typename T>
auto Integer<T>::operator=(const SelfReference rhs) -> SelfReference
{
     blah;
}
Run Code Online (Sandbox Code Playgroud)