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