C++ 模板方法专门化&x2B;一般实施+;优化=无限递归?

C++ 模板方法专门化&x2B;一般实施+;优化=无限递归?,c++,C++,我有以下makefile来构建以下几个文件 FLAGS = -O3 release: main Collection g++ -o main Collection.o main.o $(FLAGS) main: main.cpp g++ -c main.cpp -std=c++17 $(FLAGS) Collection: Collection.cpp Collection.hpp g++ -c Collection.cpp -std=c++17 $(FLAGS)

我有以下makefile来构建以下几个文件

FLAGS = -O3

release: main Collection
    g++ -o main Collection.o main.o $(FLAGS)

main: main.cpp
    g++ -c main.cpp -std=c++17 $(FLAGS)

Collection: Collection.cpp Collection.hpp
    g++ -c Collection.cpp -std=c++17 $(FLAGS)

clean: main
    rm -f main *.o
///Collection.hpp
#包括
结构再钙化{
静态constexpr int val=0;
};
模板
结构重装{
静态constexpr int val=值;
};
类集合{
公众:
集合();
~Collection();
void Add(int键,int值);
模板
int Get(int key)常量;
私人:
std::无序映射值;
};
模板
int集合::Get(int键)const{
返回Get(key)+RecallPolicy::val;
}
///Collection.cpp
#包括“Collection.hpp”
Collection::Collection()=默认值;
集合::~Collection()=默认值;
void集合::添加(int-key,int-value){values\ukey]=value;}
模板
int集合::Get(int键)const{
返回值_uu.at(键);
}
///main.cpp
#包括
#包括“Collection.hpp”
int main(){
c组;
c、 增加(10、12);

std::cout此程序格式不正确,无需诊断

[温度说明规格]/6如果模板、成员模板或类模板的成员被明确地专门化,那么在第一次使用该专门化之前,该专门化应在发生此类使用的每个翻译单元中声明,该专门化将导致隐式实例化;无需诊断


此程序格式不正确,无需诊断

[温度说明规格]/6如果模板、成员模板或类模板的成员被明确地专门化,那么在第一次使用该专门化之前,该专门化应在发生此类使用的每个翻译单元中声明,该专门化将导致隐式实例化;无需诊断


编译器在逻辑上不可能“看到专门化”在<代码>集合.CPP < /代码>编译<代码>主CPP<代码>文件。C++不这样工作。至少你必须声明标题文件中的专业化。这是一个未定义的行为,违反了一个定义规则。这能回答你的问题吗?我理解SamVarshavchik说的,但是我猜Q越大。问题是为什么优化级别之间的行为存在差异。是的,编译器需要明确专门化模板函数的可见性(至少,专门化的声明在别处定义)。如果我的记忆正确,你在做什么(在一个编译单元中调用模板化函数,而不显示明确的专门化,并在另一个编译单元中定义专门化)会产生未定义的行为-这与影响行为的代码优化完全一致(包括内联在内的优化策略通常从假设没有未定义的行为开始)@tree如果行为根据优化级别而变化,那么你的机会是很好的。猜测观察到的行为是如何发生的有时有学术兴趣,但缺乏实际效用。如果你的兴趣是学术性的而不是实践性的,那么你的问题应该清楚地说明这一点(并且要注意,推测与“基于意见”的推测非常接近。)从逻辑上讲,编译器不可能“看到专业化”在<代码>集合.CPP < /代码>编译<代码>主CPP<代码>文件。C++不这样工作。至少你必须声明标题文件中的专业化。这是一个未定义的行为,违反了一个定义规则。这能回答你的问题吗?我理解SamVarshavchik说的,但是我猜Q越大。问题是为什么优化级别之间的行为存在差异。是的,编译器需要明确专门化模板函数的可见性(至少,专门化的声明在别处定义)。如果我的记忆正确,你在做什么(在一个编译单元中调用模板化函数,而不显示明确的专门化,并在另一个编译单元中定义专门化)会产生未定义的行为-这与影响行为的代码优化完全一致(包括内联在内的优化策略通常从假设没有未定义的行为开始)@tree如果行为根据优化级别而变化,那么你的机会是很好的。猜测观察到的行为是如何发生的有时有学术兴趣,但缺乏实际效用。如果你的兴趣是学术性的而不是实践性的,那么你的问题应该清楚地说明这一点(请注意,推测非常接近于“基于意见”)。因此,当禁用优化时,它“正确”工作的事实纯粹是运气/取决于编译器实现?是的。在这种情况下。因此,它“正确”工作的事实当优化被禁用时,这完全取决于编译器的实现吗?是的,在这种情况下。