模板参数推导/替换失败 C++
template argument deduction/substitution failed c++
我有三个文件: 主要:
#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;
}
页眉:
#include <iostream>
#pragma once
class Punkt{
public:
Punkt(int x, int y){
m_x = x;
m_y = y;
}
template <typename T> int wsp() const;
private:
int m_x;
int m_y;
};
.cpp:
#include "Punkt.h"
#include <iostream>
using namespace std;
template <typename T>
int Punkt::wsp() const
{
int obiekt(T);
try{
if (obiekt==1){
return m_y;
}
if (obiekt==0){
return m_x;
}
throw;
}
catch(...){
std::cout << "Incorrect number" << std::endl;
}
}
问题在于:
Main.cpp:46:35: error: no matching function for call to ‘Punkt::wsp() const’
std::cout << "s1 " << s1.wsp<0>() << " " << s1.wsp<1>() << std::endl;
In file included from Main.cpp:39:0:
Punkt.h:11:28: note: candidate: template<class T> int Punkt::wsp() const
template <typename T> int wsp() const;
Punkt.h:11:28: note: template argument deduction/substitution failed:
我从模板开始,我不明白发生了什么。 当我将 wsp 更改为:"模板"(和功能 ofc(时,它工作正常。 有人知道吗?
在编写模板时,typename
不仅仅是您放在模板参数前面的随机关键字,它具有特定的含义。
将模板参数视为编译时参数。像所有参数一样,它们具有类型和名称。typename
意味着模板参数的类型将是某个运行时类型的名称。
因此,当您声明:
template <typename T> int wsp() const;
你的意思是:
"wsp 是接受一个名为 T 的单个编译时参数的函数,该参数将是一个类型的名称">
当你调用wsp<1>()
时,编译器会告诉你:"嘿!1
不是类型的名称!你告诉我wsp<typename>
,这毫无意义。
解决此问题很容易,您只需将模板参数的类型从typename
更改为int
.
template <int T> int wsp() const;
由于wsp
是一个模板,解析器会混淆它是某个表达式(wsp < 0) > ()
还是带有模板参数的函数。这就是为什么您需要指定obj.template wsp<0>()
来消除这两种情况之间的歧义。
相关文章:
- 模板参数替换失败,并且未完成隐式转换
- 要求子句中不允许哪些替换失败?
- 模板参数推导/替换失败,lambda作为函数指针
- 类模板参数推导失败会导致替换失败
- C++ 带有 decltype 的 SFINAE:替换失败成为错误?
- 折叠表达式模板参数推导/替换失败
- 使用"std::function"和先前推断的模板参数替换失败 - 为什么?
- 模板参数推导/替换失败 C++
- 当Boost ::绑定模板函数时,模板参数扣除/替换失败
- SFINAE使用演绎,但用替换失败
- 为什么代码中的模板参数推导/替换失败?-.
- GCC 模板参数推断/替换失败
- 为什么模板参数推导/替换失败
- 模板模板参数的替换失败
- C++模板参数推导/替换失败
- C++模板参数推导/替换失败:
- 使用类型名参数时,模板参数推导/替换失败
- 有没有办法将模板的替换失败转换为布尔值(真/假)或标签(标准::true_type/标准::false_type)
- 模板参数扣除/替换失败-STD :: find()
- std::tuple_cat替换失败