我无法理解如何在课程中使用模板。我很抱歉,如果有人问过,但我无法找到谷歌的答案。我有一个头文件,如下所示:
/*
* File: Jvec.h
* Author: jspada20
*
* Created on July 29, 2014, 3:52 PM
*/
#ifndef JVEC_H
#define JVEC_H
#include <iostream>
using namespace std;
template<typename T>
class Jvec3
{
public:
//jvec3();
template<typename tt> Jvec3(tt px, tt py, tt pz) {
x = px;
y = py;
z = pz;
}
template<typename tt> tt get_x(){
return x;
}
private:
T x;
T y;
T z;
};
我可以毫无问题地制作Jvec3对象,并且能够在没有问题的情况下对其进行初始化:
Jvec3<float> myVector(1.2,2.5,.69);
我遇到的问题是当我尝试创建一个返回或更改私有变量的函数时。当我运行命令时:
cout << myVector.get_x();
我得到以下输出:main.cpp:21:main.cpp:21:错误:没有匹配函数来调用'Jvec3 :: get_x()'
有人能否提供正确的语法来解决这个问题?
答案 0 :(得分:1)
你必须指定模板参数(有些情况下你也没有,但在这里,编译器无法推断它。)
cout << myVector.get_x<float>();
^^^^^
Here
但是你的设计是......很奇怪,我想你真正想要的只是重用T
模板参数,根本不需要模板成员函数:
template<typename T>
class Jvec3
{
public:
Jvec3(T px, T py, T pz) {
x = px;
y = py;
z = pz;
}
T get_x(){
return x;
}
private:
T x;
T y;
T z;
};
int main(){
Jvec3<float> myVector(1.2,2.5,.69);
cout << myVector.get_x();
}
答案 1 :(得分:1)
我认为您正在寻找的所需行为是从类定义中删除模板声明。您只需要在类上具有模板声明,除非您要为成员函数定义专用模板参数。如果您还没有,请务必仔细阅读语法:) http://www.cplusplus.com/doc/tutorial/templates/
template < typename T >
class Jvec3
{
public:
//jvec3();
Jvec3(T px, T py, T pz)
{
x = px;
y = py;
z = pz;
}
T get_x()
{
return x;
}
private:
T x;
T y;
T z;
};