【问题标题】:Typedef with template parameter in C++ [duplicate]C ++中带有模板参数的Typedef [重复]
【发布时间】:2013-02-12 12:52:00
【问题描述】:

我该如何解决这个错误?

我的头文件

template<typename T>
class C1 {
public:
typedef std::vector<T::F> TFV;
TFV Function1();
};

我的 CPP 文件

template<typename T>
TFV C1::Function() //error: ‘TFV’ does not name a type
{ }

【问题讨论】:

    标签: c++ templates typedef


    【解决方案1】:

    首先,使用typename 关键字告诉编译器将F 解释为类型的(限定)名称:

    typedef std::vector<typename T::F> TFV;
    //                  ^^^^^^^^
    

    其次,TFV 不是在全局命名空间中定义的类型,因此您还必须在 Function1() 的定义中正确限定它:

        template<typename T>
        typename C1<T>::TFV C1<T>::Function1()
    //  ^^^^^^^^ ^^^^^^^      ^^^
        { }
    

    最后,类模板的成员函数的定义应该放在一个头文件中,除非你为所有你会隐式生成的模板实例提供显式实例。

    如果不这样做,很可能会导致链接器出现未解决的引用错误。

    【讨论】:

    • 第三,定义需要放在头部,除非在.cpp文件中为所有需要的类型实例化。
    • @PeterWood:正确。让我提一下
    • 感谢您逐步清晰地解释。
    • @user592748:很高兴它有帮助:-)
    【解决方案2】:

    有 C++11?然后使用尾随返回类型。

    template<typename T>
    class C1 {
    public:
      typedef std::vector<typename T::F> TFV;
      TFV Function1();
    };
    
    template<typename T>
    auto C1<T>::Function1() -> TFV { }
    

    这是因为在函数的参数之后,() 在这种情况下,范围与 {} 块内的范围相同。您可以访问 this(与 decltype 结合使用),并且可以在没有范围解析运算符的情况下使用 TFV

    【讨论】:

    • 是的,我读过关于尾随返回类型的信息。谢谢。这在很大程度上简化了代码。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 2019-09-06
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    相关资源
    最近更新 更多