【发布时间】:2017-07-06 23:44:21
【问题描述】:
查看 tps.hpp 中的base::m_visible 方法(它是«默认»):
#include <sstream>
#include <iostream>
template <typename T> struct base
{
void m_log() const;
void m_visible() const;
};
struct inheritor: base<inheritor>
{
void log() const;
};
template <typename T> void base<T>::m_log() const
{
std::ostringstream os;
m_visible();
os.str(""); // We have «default/default» if comment here, :-0
std::cout << os.str();
}
template <typename T> void base<T>::m_visible() const
{
std::cout
<< "default" << std::endl
;
}
专门用于 tps_spec.cpp 中的 inheritor 结构(命名为 «spec»):
#include "tps.hpp"
template <> void base<inheritor>::m_visible() const
{
std::cout
<< "spec" << std::endl
;
}
void inheritor::log() const
{
m_log();
}
并进一步从 tps_main.cpp 调用:
#include "tps.hpp"
int main(int, char **argv)
{
std::cout << argv[0] << ": ";
inheritor().m_log(); // We have «spec/spec» if call inheritor::log
return 0;
}
结果取决于编译单元的顺序(GCC 4.8.4):
g++ -Wall -O3 -o tps1 tps_spec.cpp tps_main.cpp && g++ -Wall -O3 -o tps2 tps_main.cpp tps_spec.cpp && ./tps1 ; ./tps2
./tps1: spec
./tps2: default
只有在优化-O3 时才会发生这种情况。任何由 cmets 标记的实验版本都会产生不同的结果。 为什么?
【问题讨论】:
标签: c++ templates specialization gcc4