函数中的模板类型推导return类型
Template type deduction in function return type
这是在 Template type deduction for member variables and function arguments
上发布的问题的延续
我的 .h 文件包含以下行。
#include <iostream>
#include <complex>
#include <typeinfo>
template <typename T>
class MyClass
{
template <typename T0>
struct myTypeTraits
{ using type = T0; };
template <typename T0>
struct myTypeTraits<std::complex<T0>>
{ using type = T0; };
public:
using T0 = typename myTypeTraits<T>::type;
void setVar1(const T0& v);
void setVar2(const T& v);
T0 getVar1() const;
T getVar2() const;
void print() const;
T0 var1;
T var2;
};
.cpp 文件包含以下代码。
#include "tmp.h"
template <class T>
void MyClass<T>::setVar1(const T0& v)
{
var1 = v;
}
template <class T>
void MyClass<T>::setVar2(const T& v)
{
var2 = v;
}
template <class T>
T0 MyClass<T>::getVar1() const
{
return var1;
}
template <class T>
T MyClass<T>::getVar2() const
{
return var2;
}
template <typename T>
void MyClass<T>::print() const
{
std::cout<<"var1: "<<var1<<std::endl;
std::cout<<"var2: "<<var2<<std::endl;
}
int main()
{
MyClass<float> tmp;
MyClass<std::complex<float> > tmp1;
tmp.print();
tmp1.print();
return 0;
}
现在,当我在 g++ 中使用 C++ 11 支持编译代码时,出现以下错误。
tmp.cpp:17:1: error: ‘T0’ does not name a type
T0 MyClass<T>::getVar1() const
^
如何消除错误?
试试
// ......................vvvvvvvvvvvvvvvvvvvvvvv
void MyClass<T>::setVar1(typename MyClass<T>::T0 const & v)
{
var1 = v;
}
getVar1()
也一样
编译器无法知道T0
定义在MyClass<T>
中。所以你需要正确限定reutrn类型:
template <class T>
typename MyClass<T>::T0 MyClass<T>::getVar1() const {
return var1;
}
或者,您可以使用尾随 return 类型,您也不需要限定它:
template <class T>
auto MyClass<T>::getVar1() const -> T0 {
return var1;
}
这是在 Template type deduction for member variables and function arguments
上发布的问题的延续我的 .h 文件包含以下行。
#include <iostream>
#include <complex>
#include <typeinfo>
template <typename T>
class MyClass
{
template <typename T0>
struct myTypeTraits
{ using type = T0; };
template <typename T0>
struct myTypeTraits<std::complex<T0>>
{ using type = T0; };
public:
using T0 = typename myTypeTraits<T>::type;
void setVar1(const T0& v);
void setVar2(const T& v);
T0 getVar1() const;
T getVar2() const;
void print() const;
T0 var1;
T var2;
};
.cpp 文件包含以下代码。
#include "tmp.h"
template <class T>
void MyClass<T>::setVar1(const T0& v)
{
var1 = v;
}
template <class T>
void MyClass<T>::setVar2(const T& v)
{
var2 = v;
}
template <class T>
T0 MyClass<T>::getVar1() const
{
return var1;
}
template <class T>
T MyClass<T>::getVar2() const
{
return var2;
}
template <typename T>
void MyClass<T>::print() const
{
std::cout<<"var1: "<<var1<<std::endl;
std::cout<<"var2: "<<var2<<std::endl;
}
int main()
{
MyClass<float> tmp;
MyClass<std::complex<float> > tmp1;
tmp.print();
tmp1.print();
return 0;
}
现在,当我在 g++ 中使用 C++ 11 支持编译代码时,出现以下错误。
tmp.cpp:17:1: error: ‘T0’ does not name a type
T0 MyClass<T>::getVar1() const
^
如何消除错误?
试试
// ......................vvvvvvvvvvvvvvvvvvvvvvv
void MyClass<T>::setVar1(typename MyClass<T>::T0 const & v)
{
var1 = v;
}
getVar1()
编译器无法知道T0
定义在MyClass<T>
中。所以你需要正确限定reutrn类型:
template <class T>
typename MyClass<T>::T0 MyClass<T>::getVar1() const {
return var1;
}
或者,您可以使用尾随 return 类型,您也不需要限定它:
template <class T>
auto MyClass<T>::getVar1() const -> T0 {
return var1;
}