模板参数推导/替换失败c ++

时间:2018-05-21 16:19:53

标签: c++ templates

我有三个文件: 主:

#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的功能)时,它可以正常工作。 有人有任何想法吗?

2 个答案:

答案 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>()来消除两种情况之间的歧义。