c ++将类与寺庙组合 - 声明其他功能?

时间:2014-07-29 22:16:09

标签: c++ class templates

我无法理解如何在课程中使用模板。我很抱歉,如果有人问过,但我无法找到谷歌的答案。我有一个头文件,如下所示:

    /* 
 * 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()'

有人能否提供正确的语法来解决这个问题?

2 个答案:

答案 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;
};