Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在.cpp文件中使用条件类型_C++_C++11_Typetraits - Fatal编程技术网

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

C++ 在.cpp文件中使用条件类型,c++,c++11,typetraits,C++,C++11,Typetraits,我有一个模板类和一个依赖于模板的类型。如何在.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>::v

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

如果在对象部分之前使用,则需要限定名称


如果在对象部分之前使用名称,则需要对其进行限定


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

参数使用相同的名称T命名,使这些名称不同

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

您忘记了声明中定义中返回类型上的常量限定符

从属名称缺少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
}

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

参数使用相同的名称T命名,使这些名称不同

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

您忘记了声明中定义中返回类型上的常量限定符

从属名称缺少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;
除非您需要两个模板类型参数。即使需要两个类型参数,也可以直接使用它们

我没说不要使用静态断言

你为什么需要这个

using pair = typename std::conditional<std::is_same<T, float>::value,
                     pair_f, pair_d>::type;
为什么不只是:

typedef std::pair<T,T> pair;
除非您需要两个模板类型参数。即使需要两个类型参数,也可以直接使用它们


我没说不要使用静态断言

typename对象::pairtypename对象::Pairy您的模板应仅驻留在标题中,不要将其拆分为h和cpp文件您的模板应仅驻留在标题中,不要将其拆分为h和cpp文件I修复了1和3,谢谢。我想拆分声明和定义,因为定义很长。这在头文件中看起来不太好。@gartenriese:您的解决方案根本不起作用,请参阅我修复了1和3,谢谢。我想拆分声明和定义,因为定义很长。这在头文件中看起来不太好。@gartenriese:您的解决方案根本不起作用,请参阅我在使用typedef时是否有相同的问题?否。您不能在CPP文件中实现类模板作为翻译单元。模板使用两阶段编译过程进行编译。第二阶段将仅在模板实例化时进行,这不会导致CPP文件的第二阶段编译。在使用typedef时是否存在相同的问题?否。不能在CPP文件中实现类模板作为翻译单元。模板使用两阶段编译过程进行编译。第二阶段将仅在模板实例化时进行,这不会导致CPP文件的第二阶段编译。