gpt4 book ai didi

c++ - 如何根据 C++11 标准在不同文件之间拆分模板特化?

转载 作者:太空狗 更新时间:2023-10-29 23:01:05 25 4
gpt4 key购买 nike

我想使用模板特化实现一些依赖于其他一些整数常量的整数常量,例如

//main.cpp
#include<cstdint>

template <uint64_t D> struct space_per_element { static const uint64_t bits; };

template <> const uint64_t space_per_element<2>::bits = 1;

int main() {
return space_per_element<2>::bits;
}

哪个编译好用

g++ -std=c++11 main.cpp

但是一旦我尝试像这样拆分它。

//constants.hpp
#include<cstdint>

template <uint64_t D> struct space_per_element { static const uint64_t bits; };

//constants.cpp
#include "constants.hpp"

template <> const uint64_t space_per_element<2>::bits = 1;

//main.cpp
#include "constants.hpp"

int main() {
return space_per_element<2>::bits;
}

并使用它编译它。

g++ -std=c++11 main.cpp constants.cpp

我收到以下错误:

main.cpp: In function ‘int main()’:
main.cpp:4:11: error: ‘space_per_element’ was not declared in this scope
return space_per_element<2>::bits;
^
main.cpp:4:31: error: ‘::bits’ has not been declared
return space_per_element<2>::bits;
^
constants.cpp:3:45: error: expected initializer before ‘<’ token
template <> const uint64_t space_per_element<2>::bits = 1;

有趣的是,代码适用于

g++ -std=gnu++11 main.cpp constants.cpp

clang -std=c++11 main.cpp constants.cpp

我现在的问题是:这里使用了哪个 GNU 扩展?代码是否违反标准?如果是:如何仅使用标准在多个文件中实现此代码?如果 Clang 似乎支持相同的代码,那么使用 GNU++11 是否会被视为不好的做法(从可移植性的角度来看)?

最佳答案

在同一个目录中,似乎有一些预编译的头文件与其他代码不匹配。删除它们后 ( rm *.gch ),我可以使用 g++ -std=c++11 main.cpp constants.cpp 编译文件.

看来,这两个工作选项有效,因为它们没有使用这些预编译头文件。

关于c++ - 如何根据 C++11 标准在不同文件之间拆分模板特化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31921010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com