MCVE的作用大于言语:
// int bar();
template <bool B> class Foo {
friend int ::bar() { return 123; }
};
int main()
{
Foo<false> f1;
Foo<true> f2;
}
使用GCC 6和--std=c++14
,这将给我:
a.cpp: In instantiation of ‘class Foo<true>’:
a.cpp:9:12: required from here
a.cpp:3:13: error: redefinition of ‘int bar()’
friend int ::bar() { return 123; }
^~
a.cpp:3:13: note: ‘int bar()’ previously defined here
现在,我不确定标准是什么;但我知道编译器知道友元函数没有在B
上进行模板化,也没有使用B
的定义。那么为什么不能应用“哦,所有相同定义的内联副本的函数都是相同的”规则呢?