如何将UString类的bool特化模板函数To()移至cpp文件?
能否将UString类中bool类型的To() const成员函数移至cpp文件?
首先得明确:你代码里针对bool的To()不是模板特化,而是靠std::enable_if实现的模板重载——它是一个独立的模板声明,只是限定了只有T是bool时才会匹配到这个版本。
直接移到cpp文件里不行,原因和C++模板的编译规则有关:
- C++模板是按需实例化的,编译器在调用模板函数的地方,必须能看到完整的模板实现代码,才能生成对应的实例。
- 这个bool版本的
To()本质还是模板函数,只是被enable_if限制了适用场景。如果把实现藏到cpp里,调用它的代码所在的编译单元看不到实现,链接阶段就会报“未定义引用”的错误。
当然也不是完全没办法放到cpp里,你可以在cpp文件里显式实例化这个模板:
- 头文件里的UString类声明保持原样不动。
- 在cpp文件里先写实现,再加一行显式实例化的代码:
// UString.cpp #include "UString.h" template<typename T, typename std::enable_if<std::is_same<T, bool>::value>::type*> bool UString::To() const { // 你的具体实现代码 } // 显式实例化T=bool的版本,让编译器提前生成实例 template bool UString::To<bool>(void) const;
这么做之后,编译器会在这个cpp文件里提前生成该模板的实例,链接时其他编译单元就能找到对应的符号了。
内容的提问来源于stack exchange,提问作者user1633272
相关产品推荐
相关产品推荐

