繁体   English   中英

在.cpp文件中使用条件类型

[英]using a conditional type in a .cpp file

我有一个模板化的类和一个取决于模板的类型。 如何在.cpp文件中使用此类型?

object.hpp:

using pair_d = std::pair<double, double>;
using pair_f = std::pair<float, float>;

template <typename T>
class Object {
    public:
        static_assert(std::is_same<T, float>::value ||
                      std::is_same<T, double>::value, "Type not allowed");

        using pair = typename std::conditional<std::is_same<T, float>::value,
                     pair_f, pair_d>::type;

        // function using the conditional type
        const pair doSomething(T, T) const;
}

object.cpp

#include "object.hpp"

template <typename T>
const pair Object<T>::doSomething(T t1, T t2) const {
    // ....
}

但是我得到:

错误:未知类型名称“ pair”

如何在.cpp文件中使用“ pair”类型?

如果在Object<T>部分之前使用名称,则需要限定名称。

template <typename T>
typename Object<T>::pair Object<T>::doSomething(T t, T t) const {
    // ....
}

您的代码段中有四个问题:

  1. 参数使用相同的名称(T t, T t)命名,使这些名称不同。

  2. 您已将模板声明/定义拆分为cpp和头文件,请不要这样做。

  3. 您忘记了定义(在声明中)的返回类型上的const限定符。

  4. 您缺少相关名称的typename关键字。

您的定义应为:

template <typename T>
const typename Object<T>::pair Object<T>::doSomething(T t1, T t2) const {
    // stuff
}

或(避免使用从属名称):

template <typename T>
auto Object<T>::doSomething(T t1, T t2) const -> const pair {
    // stuff
}

你为什么需要这个?

using pair = typename std::conditional<std::is_same<T, float>::value,
                     pair_f, pair_d>::type;

为什么不只是:

typedef std::pair<T,T> pair;

除非您需要两个模板类型参数。 即使您需要两个类型参数,也可以直接使用它们。

我不是说不要使用static_assert

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM