![](/img/trans.png)
[英]Using a class created in a cpp file as an argument type in a header file
[英]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 {
// ....
}
您的代码段中有四个问题:
参数使用相同的名称(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
}
你为什么需要这个?
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.