类似于这个问题关于模板类的静态const类成员的显式专业化,以及关于模板类的显式专业化的这个问题,但是我的问题是变量模板的显式专业化。
我的MCVE:
//my_templated_literal.h
#pragma once
template <typename T>
constexpr T val;//my_specialised_literal.h
#pragma once
#include "my_templated_literal.h"
template <>
constexpr int val<int> = 2;//my_specialised_literal.cc
#include "my_specialised_literal.h"//main.cc
#include "my_specialised_literal.h"
int main() {}编译命令:编译命令:$CXX -std=c++14 my_specialised_literal.cc main.cc编译,在我尝试过的几乎每一个编译器版本上都像预期的那样工作,但是会给出clang-9的链接器错误:
/tmp/main-ec49c7.o:(.rodata+0x0):“`val”的多个定义 /tmp/my_specialised_literal-521691.o:(.rodata+0x0):首先在这里定义
这是大多数编译器版本默认接受的ODR冲突,还是clang-9在某种程度上是错误的?如果是前者,我知道如果我可以使用C++17,我可以通过创建专门化inline来修复它,但是针对这个问题的C++14修复是什么呢?
https://stackoverflow.com/questions/58495283
复制相似问题