C++ 在实现文件中声明具有模板参数的方法

C++ 在实现文件中声明具有模板参数的方法,c++,c++11,templates,c++14,constexpr,C++,C++11,Templates,C++14,Constexpr,用模板参数(特别是在使用constexpr函数时使用)在不同的位置分离类方法的定义和声明是否可能?因为“模板参数”不像模板函数的显式专门化吗 或者,这种情况是否与已经充分讨论的话题相纠结: 例如: 头文件“someHeader.h” #包括 #布拉格语一次 cc类 { 公众: cc()=默认值; ~cc()=默认值; 模板 constexpr uint32 ispowerrof2(); 私人: }; 然后是*.cpp文件: // cpp-file #include "someHeader.

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

或者,这种情况是否与已经充分讨论的话题相纠结:

例如: 头文件“someHeader.h”

#包括
#布拉格语一次
cc类
{
公众:
cc()=默认值;
~cc()=默认值;
模板
constexpr uint32 ispowerrof2();
私人:
};
然后是*.cpp文件:

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

template<uint32 val>
constexpr uint32 cc::isPowerOf2()
{
    return ((val&(val-1))==0);
}
//cpp文件
#包括“someHeader.h”
模板
constexpr uint32 cc::isPowerOf2()
{
返回((val&(val-1))==0);
}

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


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

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

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

让我们在函数声明中说:
模板无效打印\u方格(T)

看到这一点,你能说些什么:
“将在类型
T
上应用哪些操作?”
老实说,没什么

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

template <typename T>
void print_square(T t)
{
    std::cout << t * t; 
}
模板
空打印方格(T)
{

std::cout基本上是否定的。原因是调用代码通过填充调用的类型来生成函数体。因此,编译器需要看到模板体,而不仅仅是签名。(当然有办法解决这个问题,但这是20多年前制定规则时的动机)。
template <typename T>
void print_square(T t)
{
    std::cout << t * t; 
}