是否可以在不同的地方用模板参数(特别是在使用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);
}
答案 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()
,因为它不符合要求。