我有三个文件: 主:
#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更改为:&#39; template&#39;(以及c的功能)时,它可以正常工作。 有人有任何想法吗?
答案 0 :(得分:0)
在编写模板时,typename
不仅仅是您放在模板参数前面的随机关键字,它具有特定的含义。
将模板参数视为编译时参数。与所有参数一样,它们具有类型和名称。 typename
表示模板参数的类型将是某个运行时类型的名称。
所以,当你声明:
template <typename T> int wsp() const;
您所说的是:
“wsp是一个函数,它接受一个名为T的单个编译时参数,它将是一个类型的名称”
当您致电wsp<1>()
时,编译器会告诉您:“嘿!1
不是类型的名称!您告诉我wsp<typename>
,这没有任何意义。”
修复此问题很简单,您只需将模板参数的类型从typename
更改为int
。
template <int T> int wsp() const;
答案 1 :(得分:-1)
由于wsp
是一个模板,解析器会感到困惑,无论是某个表达式(wsp < 0) > ()
还是带有模板参数的函数。这就是为什么你需要指定obj.template wsp<0>()
来消除两种情况之间的歧义。