代码之家  ›  专栏  ›  技术社区  ›  Drawkcab Esrever

找不到使用位集实例化模板函数的有效方法

  •  0
  • Drawkcab Esrever  · 技术社区  · 7 年前

    我在bit_tools.h中声明了一个模板函数

    template <size_t sizeA, size_t sizeB, size_t sizeAB>
    std::bitset<sizeAB> join2(std::bitset<sizeA> bsetA,\
                               std::bitset<sizeB> bsetB);
    

    下面是bit_tools.cc中join2的定义

    template <size_t sizeA, size_t sizeB, size_t sizeAB>
    std::bitset<sizeAB> join2(std::bitset<sizeA> bsetA, std::bitset<sizeB> bsetB){
        return std::bitset<sizeAB>(bsetA.to_string + bsetB.to_string);
    

    在main.cpp中尝试使用join2之后,我得到了预期的链接器错误。我读过一些方法,其中涉及在.cpp文件中放入一行来实例化模板。但是,鉴于位集必须有一个非类型模板参数,我不确定我应该怎么做?

    理想情况下我会这样做

    template std::bitset<int>  join2<int,int,int>(std::bitset<int> bsetA, std::bitset<int> bsetB)
    

    但这是不合法的

    1 回复  |  直到 7 年前
        1
  •  0
  •   Dmytro Ovdiienko    7 年前

    以下代码对我有效。在VS2017和G++7.3上编译

    // 
    // bit_tools.h
    // 
    #include <bitset>
    
    template <size_t sizeA, size_t sizeB, size_t sizeAB>
    std::bitset<sizeAB> join2(std::bitset<sizeA> bsetA,
                               std::bitset<sizeB> bsetB);
    
    // 
    // bit_tools.cc
    // 
    #include "bit_tools.h"
    
    template <size_t sizeA, size_t sizeB, size_t sizeAB>
    std::bitset<sizeAB> join2(std::bitset<sizeA> bsetA, std::bitset<sizeB> bsetB) {
        return std::bitset<sizeAB>(bsetA.to_string() + bsetB.to_string());
    }
    
    // Here you should provide integer constants instead of type
    template
    std::bitset<32>  join2<16,16,32>(std::bitset<16> bsetA, std::bitset<16> bsetB);
    
    // 
    // main.cc
    // 
    
    #include "bit_tools.h"
    
    int main() {
    
        std::bitset<16> bsetA;
        std::bitset<16> bsetB;
    
        join2<16,16,32>(bsetA, bsetB);
    }