【问题标题】:Template type deduction in function return type函数返回类型中的模板类型推导
【发布时间】:2017-11-17 17:33:22
【问题描述】:

这是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
 ^

如何消除错误?

【问题讨论】:

标签: c++ c++11 templates template-argument-deduction


【解决方案1】:

编译器无法知道T0 是在MyClass&lt;T&gt; 中定义的。所以你需要正确限定 reutrn 类型:

template <class T>
typename MyClass<T>::T0 MyClass<T>::getVar1() const {
  return var1;
}

或者,您可以使用尾随返回类型,您也不需要限定:

template <class T>
auto MyClass<T>::getVar1() const -> T0 {
  return var1;
}

【讨论】:

    【解决方案2】:

    试试

    // ......................vvvvvvvvvvvvvvvvvvvvvvv
    void MyClass<T>::setVar1(typename MyClass<T>::T0 const & v)
    {
        var1 = v;
    }
    

    getVar1() 也一样

    【讨论】:

    • 虽然当然允许,但这对于setVar1 并不是绝对必要的,因为编译器可以发现T0 被定义在MyClass&lt;T&gt; 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    相关资源
    最近更新 更多