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

using a conditional type in a .cpp file

本文关键字:条件 类型 cpp 文件      更新时间:2023-10-16

我有一个模板化的类和一个依赖于模板的类型。如何在.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;
}

对象.cpp

#include "object.hpp"
template <typename T>
const pair Object<T>::doSomething(T t1, T t2) const {
    // ....
}

但我得到的是:

错误:未知类型名称"对"

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

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

  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
}

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

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

为什么需要这个?

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

为什么不只是:

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

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

我没有说不要使用static_assert