在实现文件中使用模板参数声明方法

时间:2018-08-17 10:30:26

标签: c++ c++11 templates c++14 constexpr

是否可以在不同的地方用模板参数(特别是在使用constexpr函数时使用)来分隔类方法的定义和声明?因为“模板参数”不像模板功能的显式专门化吗?

或者这种情况与已经讨论过的主题纠缠不清: Why can’t I separate the definition of my templates class from its declaration and put it inside a .cpp file?

Why can templates only be implemented in the header file?

例如: 头文件“ someHeader.h”

#include <iostream>

#pragma once
class cc
{
public:
    cc()=default;
    ~cc()=default;

    template<uint32 f_val2Check_u32>
    constexpr uint32 isPowerOf2();

private:
};

然后* .cpp文件:

// cpp-file
#include "someHeader.h"

template<uint32 val>
constexpr uint32 cc::isPowerOf2()
{
    return ((val&(val-1))==0);
}

2 个答案:

答案 0 :(得分:0)

编译器必须知道该函数在使用该函数的所有翻译单元中的实现方式。 constexpr关键字告诉编译器在编译时为给定参数计算函数的结果并传播该值。没有实施,就无法实现。

这将适用于非模板非constexpr函数,因为该值可以在运行时(即链接之后)进行计算。

答案 1 :(得分:0)

问题在于模板是在编译时实例化的。

因此,需要查看函数或类的定义,以了解将所有操作类应用于要传递的类型上的内容。

让我们在您的函数声明中说: template <typename T> void print_square(T t)
看到这个,您能告诉我什么:
“将对类型T进行什么操作?”
老实说,没事。

现在让我们看一下函数定义:

template <typename T>
void print_square(T t)
{
    std::cout << t * t; 
}

现在,当我们看到函数定义时,我们可以知道二进制运算符*应该适用于类型T
这是类型上的要求。该传递给模板。
用更好的话来说,就是传递了类型为T操作类别

因此,编译器需要访问功能模板的功能定义。
这样做会阻止您将std::string作为参数传递给print_square(),因为它不符合要求。