我最近刚接触使用模板作为C ++功能以及C ++ 11-17中最新增加的一些功能。
我正在尝试为枚举类定义一个类型特征,它有一些静态和常量查找表,可以在我的枚举和字符之间进行转换:
枚举类:
// DNA nucleotide symbols.
enum class DNA : uint8_t {
Gap, A, C, M, G, R, S, V,
T, W, Y, H, K, D, B, N, Invalid
};
type trait:
template<typename T>
struct conversion_table {};
template<>
struct conversion_table<DNA> {
static constexpr DNA from_char[256] = {DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Gap, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::A,
DNA::B, DNA::C, DNA::D,
DNA::Invalid, DNA::Invalid, DNA::G,
DNA::H, DNA::Invalid, DNA::Invalid,
DNA::K, DNA::Invalid, DNA::M,
DNA::N, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::R, DNA::S,
DNA::T, DNA::Invalid, DNA::V,
DNA::W, DNA::Invalid, DNA::Y,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::A, DNA::B,
DNA::C, DNA::D, DNA::Invalid,
DNA::Invalid, DNA::G, DNA::H,
DNA::Invalid, DNA::Invalid, DNA::K,
DNA::Invalid, DNA::M, DNA::N,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::R, DNA::S, DNA::T,
DNA::Invalid, DNA::V, DNA::W,
DNA::Invalid, DNA::Y, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid, DNA::Invalid, DNA::Invalid,
DNA::Invalid};
static constexpr char to_char[16] = {'-', 'A', 'C', 'M', 'G', 'R', 'S', 'V', 'T', 'W',
'Y', 'H', 'K', 'D', 'B', 'N'};
};
但据我所知静态使得它为struct的所有实例定义一次,constexpr意味着应该在编译时评估表。
但是,如果我在这样的主函数中使用它:
#import "../biosymbols.h"
int main(){
auto a = biosymbols::conversion_table<biosymbols::DNA>::from_char['A'];
return 0;
}
我在编译期间遇到错误:
Undefined symbols for architecture x86_64:
"biosymbols::conversion_table<biosymbols::DNA>::from_char", referenced from:
_main in biosymbols_checks.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我不确定为什么,因为这类似于在网络上创建类型特征的示例。有人能指出我需要做些什么来解决这个问题吗?
谢谢!