在.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;
}
对象.cpp
#include "object.hpp"
template <typename T>
const pair Object<T>::doSomething(T t1, T t2) const {
// ....
}
但我得到的是:
错误:未知类型名称"对"
如何在.cpp文件中使用类型"pair"?
您的代码段中有四个问题:
-
参数使用相同的名称
(T t, T t)
命名,使这些名称不同。 -
您已经将模板声明/定义拆分为一个cpp和一个头文件,不要这样做。
-
您忘记了定义中(声明中)返回类型的
const
限定符。 -
依赖名称缺少
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
!
相关文章:
- 具有条件类型名的模板类
- 模板类默认类型和条件
- 根据模板类型有条件地删除变量
- 有条件地选择带有 decltype() 和三元运算符的类型
- 对于检查 >=0 终止条件时的循环索引类型
- 如果条件取决于模板类型并且在编译时已知,是否可以保证C++编译器不会生成分支?
- 在非本机类型上具有多个条件的 GDB 断点
- 用于根据条件选择编译时类型的可变参数模板
- 使用 std::条件根据模板参数选择成员类型
- GNU Radio中基于条件的输出的块类型
- 如何编译模板类型名的时条件
- 基于指针或值类型的条件类型
- 有没有一种很好的方法来实现具有默认失败情况的条件类型?
- C++:无法使用条件类型在模板函数中使用 'double' 类型的 lvalue 初始化 'char*' 类型的参数
- 条件类型声明
- C++正在传输运行时条件类型信息
- 条件类型特征通用引用的问题
- 条件类型别名定义
- 在.cpp文件中使用条件类型
- 条件类型定义在C++中可能吗?