修复洋葱式类结构中search模板方法的编译错误
编译期洋葱类搜索方法的编译错误修复
你遇到的编译错误是:
error: expected primary-expression before ‘)’ token
return p_.search<Key>();
^
这是C++中依赖名称查找的典型问题,咱们来一步步解决它:
错误原因
在模板类B<P>中,成员p_的类型是P——而P是一个模板参数(属于“依赖类型”)。当你尝试调用p_.search<Key>()时,编译器在模板实例化之前,无法确定search是一个模板成员函数:它可能会被错误地解析为p_.search(一个成员变量),然后把<当成小于运算符来处理,这就直接导致了语法错误。
修复方案
只需要在调用search模板函数时,用template关键字显式告诉编译器:这是一个模板成员函数,这样编译器就能正确识别尖括号是模板参数列表,而不是比较运算符。修改B类中的search方法即可:
template <int Key> constexpr auto& search() const { if constexpr (Key == key) return *this; return p_.template search<Key>(); // 这里添加template关键字 }
完整修复后的代码
#include <iostream> class A { public: static constexpr int key = 0; template<int s> constexpr auto& search() const { return *this; } }; template<class P> class B { public: static constexpr int key = P::key + 1; template <int Key> constexpr auto& search() const { if constexpr (Key == key) return *this; return p_.template search<Key>(); // 修复的核心位置 } P p_; }; int main() { B<B<B<B<A>>>> onion; std::cout << onion.search<1>().key << "\n"; return 0; }
补充说明
这是C++标准针对依赖名称的强制规则:当在模板内部访问依赖于模板参数的类型的成员模板时,必须使用template关键字进行显式声明,否则编译器会按照非模板名称来解析,进而引发语法错误。
内容的提问来源于stack exchange,提问作者R zu
相关产品推荐
相关产品推荐

