这是我的计划:
print.hpp:
#pragma once
#include <iostream>
template<size_t p>
void print()
{
std::cout << "" << __FILE__ << "" << __LINE__ << "" << std::endl;
exit(0);
}
print.cpp:
#include "print.hpp"
template<>
void print<13>()
{
std::cout << "Unlucky." << std::endl;
}
main.cpp中:
#include <iostream>
#include "print.hpp"
int main()
{
std::cout << "Started." << std::endl;
print<13>();
std::cout << "Exiting." << std::endl;
}
当我使用g++ main.cpp print.cpp -O0 -std=c++11 && ./a.out
编译时,它工作正常(输出为:
Started.
Unlucky.
Exiting.
)。
但是,如果我用g++ main.cpp print.cpp -O1 -std=c++11 && ./a.out
编译它,它会给我输出的分段错误:
Started.
Unlucky.
Speicherzugriffsfehler //German for memory access error
与clang ++几乎相同,没有优化它就可以正常工作 并且使用-O1或更高版本输出:
Started.
Unlucky.
./print.hpp8
为什么?
答案 0 :(得分:1)
您需要在.hpp文件中声明模板特化。
array([[ 4. , 0.8],
[ 7. , 0.4],
[ 8. , 1.2],
[ 11. , 1.5],
[ 15. , 0.1],
[ 19. , 0.5]])
如果没有.hpp文件中的声明,我会收到g ++ 6.4.0的链接器错误。
template<size_t p>
void print()
{
std::cout << "" << __FILE__ << "" << __LINE__ << "" << std::endl;
exit(0);
}
// Declare the specialization.
template<> void print<13>();
我不确定你如何在没有声明的情况下成功建立你的程序。