以下代码不会生成编译/链接器错误/警告:
// A.h
#include<iostream>
struct A
{
template<typename T>
static void foo (T t)
{
std::cout << "A::foo(T)\n";
}
};
void other ();
// main.cpp
#include"A.h"
int main ()
{
A::foo(4.7);
other();
}
// other.cpp
#include"A.h"
template<>
void A::foo (double d)
{
cout << "A::foo(double)\n";
}
int other ()
{
A::foo(4.7);
}
令人惊讶的输出是:
A::foo(T)
A::foo(double)
A::foo(double)
为什么编译器在 的情况下无法选择正确的main.cpp
?
同意,如果有A.h
如下声明,则没有预期的问题:
template<> void A::foo (double);
但这不是问题,因为在链接时,编译器有专门的版本。
此外,是否具有相同功能的 2 个不同版本的未定义行为?