【问题标题】:Non-type template arguments explicit instantiation in source file源文件中的非类型模板参数显式实例化
【发布时间】:2017-02-21 22:27:51
【问题描述】:

我正在将一个库包装到我的班级设计中。我想在我的类构造函数的库中调用一个带有 unsigned int 非类型参数的模板方法。

#include <iostream>
#include <bar.h>  // template header in here
class foo {
    foo(unsigned num) {
        BAR<num>();  // a template method BAR inside "bar.h"
    }
};

当我尝试解决这个问题时,似乎非类型参数是 constexpr。所以上面的代码会产生错误,说明函数调用内部有const错误。

所以我决定将 foo 类设为类模板,并在 foo 的模板实参参数中传递这个无符号的非类型参数。

#include <iostream>
#include <bar.h>  // template header in here
template <unsigned num>
class foo {
    foo() {
        BAR<num>();  // a template method BAR inside "bar.h"
    }
};

这似乎运作良好。但是,我想将头文件和源文件分成单独的 .hpp/.cpp 文件。根据this thread,如果我想将模板实现放在 .cpp 源文件中,我必须在 .cpp 文件末尾显式实例化所有可能的模板参数。对于像无符号整数这样的非类型参数,这是否意味着我必须实例化数千个可能的无符号整数才能使模板可用于所有无符号数字对象?感谢您的帮助。

【问题讨论】:

    标签: c++ templates constexpr non-type


    【解决方案1】:

    我不建议将模板类的实现分离到源文件中。如果我正确理解您的情况,那么我认为除非您实例化模板参数的所有可能值,否则这是不可能的,这对于 unsigned 来说是不可能的。

    【讨论】:

    • 如果我想使用非类型作为模板参数,这是否意味着我必须公开模板实现?
    • 我还是想分离实现。在这种情况下,还有另一种方法可以将 constexpr 作为参数传递给构造函数吗?
    • @yc2986 也许考虑制作类和/或其构造函数constexpr?我不确定它是否真的会做你想做的事,但这是我唯一能想到的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    相关资源
    最近更新 更多