C++模板参数推导失败求助:Punkt类wsp模板函数调用报错
为什么用类型模板参数会报错,改成非类型就正常?
嘿,我来帮你拆解这个问题~ 核心原因很简单:你最初写的模板和调用方式根本不匹配!
先看你踩的坑
你定义的wsp函数模板用的是类型模板参数:
template <typename T> int wsp() const;
这个模板的意思是:我需要你传入一个类型(比如int、bool这种),但你调用的时候却传了0、1这种数值常量:
s1.wsp<0>() // 这里传的是数值0,不是类型
编译器直接懵了:模板要的是类型,你给我个数字?自然就报了“模板参数推导失败”的错误。
为什么非类型模板参数就管用?
当你改成template <int T>时,这个模板变成了非类型模板参数——它就是专门用来接收编译期常量值的!这时候你传0、1就完全符合要求:编译器知道T是一个整数常量,可以直接用它来判断返回m_x还是m_y。
顺便修正你代码里的其他问题
原代码里的int obiekt(T);完全是错误写法(因为T是类型的时候,这行根本没法编译),改成非类型参数后可以直接简化:
修正后的Punkt.h
#pragma once #include <iostream> #include <stdexcept> // 用于抛出标准异常 class Punkt{ public: Punkt(int x, int y) : m_x(x), m_y(y) {} // 用初始化列表更规范 template <int T> int wsp() const; private: int m_x; int m_y; }; // 模板函数的实现最好放在头文件里,避免链接问题 template <int T> int Punkt::wsp() const { if constexpr (T == 0) { // 用if constexpr可以在编译期做分支优化 return m_x; } else if constexpr (T == 1) { return m_y; } else { throw std::invalid_argument("Incorrect number"); } }
修正后的main.cpp(调用逻辑不用改)
#include <iostream> #include "Punkt.h" int main() { const Punkt s1(0, 1); const Punkt s2(-5, 2); std::cout << "s1 " << s1.wsp<0>() << " " << s1.wsp<1>() << std::endl; }
额外小提醒
如果非要把模板实现放在.cpp文件里,那你需要在.cpp文件末尾显式实例化模板,否则会出现链接错误:
// 在Punkt.cpp末尾添加这两行 template int Punkt::wsp<0>() const; template int Punkt::wsp<1>() const;
不过更推荐把模板实现放在头文件里,这样更省心~
内容的提问来源于stack exchange,提问作者icnm
相关产品推荐
相关产品推荐

