此刻我发现了一些奇怪的事情。我正在尝试使用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);
* .tcc - file:
...
template<typename T> Integer<T>::SelfReference Integer<T>::operator =(const
Integer<T>::SelfReference rhs)
{
return this->assign(rhs);
};
...
过去使用gcc我通过这种方式做出任何问题但是现在在Windows上,编译器正在抱怨&#39; SelfReference&#39;:C2061:语法错误:标识符&#39; SelfReference&#39;
我不知道出了什么问题,因为过去使用的gcc ...我错过了什么吗?如果我将函数内联编写,则不会出现此问题。我现在只是好奇为什么在Windows上我遇到了这样的问题!
答案 0 :(得分:5)
SelfReference
是一种依赖类型,因此您需要使用typename
:
template <typename T>
typename Integer<T>::SelfReference Integer<T>::operator=(const typename Integer<T>::SelfReference rhs) { blah; }
在Integer<T>::
的右侧,您也可以使用SelfReference
,即。
template <typename T>
typename Integer<T>::SelfReference Integer<T>::operator=(const SelfReference rhs) { blah; }
这是c ++ 11中auto
返回值的部分原因,您现在可以编写
template <typename T>
auto Integer<T>::operator=(const SelfReference rhs) -> SelfReference
{
blah;
}