【问题标题】:C++ Calling Template Function ErrorC++调用模板函数错误
【发布时间】:2015-10-01 03:29:40
【问题描述】:

尝试编译以下代码时:

int main(){

    Array<int> *testArray = new Array<int>(5);
    testArray->initArray<int>(testArray);
    testArray->printArray<int>(testArray);



    return 0;
}

使用此模板:

template<typename T>
class Array{
public:
    Array(int size){
        size = size;
        data = new T[size];
    };
    Array<T> addData(T dataToAdd){
        Array <T> *tmp = new Array <T> (this->size);
        tmp = this->data;
        Array <T> *newData = new Array<T> (this->size + 1);

        for (int i = 0; i < this->size + 1; ++i){
            if (i < this->size){
                newData->data[i] = tmp[i];
            }
            else{
                newData->data[i] = dataToAdd;
            }
        }
        return newData;
    };
    void initArray(T arrayToInit){
        for (int i = 0; i < this->size; ++i){
            this->data[i] = i;
        }
    };
    void printArray(T arrayToPrint){
        ostringstream oss;
        string answer = "";

        for (int i = 0; i < arrayToPrint->size; ++i){
            oss << arrayToPrint[i] + " ";
        }

        answer = oss.str();

        cout << answer << endl;
    };

private:
    int size;
    T* data;
};

我的 int main() 中出现以下错误:

“‘int’之前的预期主表达式”

对于我的两个函数调用(initArray 和 printArray)。我对 C++ 相当陌生,特别是对模板几乎没有经验,任何建议都将不胜感激。感谢您的宝贵时间。

编辑:感谢大家的回复和建设性的批评,感谢大家的帮助,我取得了很大的进步。

【问题讨论】:

  • initArray&lt;int&gt;() 应该是 initArray() 但这只是问题的开始。
  • initArray 和printArray 的参数没有用。它们应该被删除。
  • 感谢您迄今为止的反馈,您看到的任何其他问题都可以指出将非常有帮助,谢谢!

标签: c++ templates compiler-errors


【解决方案1】:

在这种情况下,您不需要&lt;int&gt; 来调用该函数。 (想想std::vector&lt;int&gt;,你会写hoge.push_back(0)而不是hoge.push_back&lt;int&gt;(0)。)

Array::initArray 和Array:;:printArray 的参数也是无效且不需要的。

修复代码(不发出编译错误/警告,但不能正常工作):

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

template<typename T>
class Array{
public:
    Array(int size){
        size = size;
        data = new T[size];
    };
    Array<T> addData(T dataToAdd){
        Array <T> *tmp = new Array <T> (this->size);
        tmp = this->data;
        Array <T> *newData = new Array<T> (this->size + 1);

        for (int i = 0; i < this->size + 1; ++i){
            if (i < this->size){
                newData->data[i] = tmp[i];
            }
            else{
                newData->data[i] = dataToAdd;
            }
        }
        return newData;
    };
    void initArray(){
        for (int i = 0; i < this->size; ++i){
            this->data[i] = i;
        }
    };
    void printArray(){
        ostringstream oss;
        string answer = "";

        for (int i = 0; i < this->size; ++i){
            oss << data[i] + " ";
        }

        answer = oss.str();

        cout << answer << endl;
    };

private:
    int size;
    T* data;
};

int main(){

    Array<int> *testArray = new Array<int>(5);
    testArray->initArray();
    testArray->printArray();



    return 0;
}

【讨论】:

  • 如果您要提供额外的改进,您不妨将两阶段初始化转储到构造函数中。
  • 我很惊讶size = size; 和tmp = this-&gt;data; 没有产生任何警告或错误。
【解决方案2】:

这是更改后的工作代码:

#include <string>
#include <iostream>
#include <cstdint>
#include <iostream>
#include <string>
#include <sstream>


using namespace std;

template<typename T>
class Array{
public:
    Array(int size){
        size = size;
        data = new T[size];
    }
    Array<T> addData(T dataToAdd){
        Array <T> *tmp = new Array <T> (this->size);
        tmp = this->data;
        Array <T> *newData = new Array<T> (this->size + 1);

        for (int i = 0; i < this->size + 1; ++i){
            if (i < this->size){
                newData->data[i] = tmp[i];
            }
            else{
                newData->data[i] = dataToAdd;
            }
        }
        return newData;
    }
    void initArray(Array<T>* arrayToInit){
        for (int i = 0; i < this->size; ++i){
            this->data[i] = i;
        }
    }
    void printArray(Array<T>* arrayToPrint){
        ostringstream oss;
        string answer = "";

        //for (int i = 0; i < arrayToPrint->size; ++i){
           // oss << data[i] + " ";
             answer = oss.str();

        cout << answer << endl;
    }

private:
    int size;
    T* data;
};



int main()
{
   string s;
   double d =9.0;

   s=d;

    Array<int> *testArray = new Array<int>(5);
    testArray->initArray(testArray);
    testArray->printArray(testArray);
   return 0;
}

进行的更改:

模板实例化发生在您声明类时。无需为其成员函数再次执行此操作。

也不需要追加;在每个成员函数定义之后,只有类定义需要。

【讨论】:

    猜你喜欢
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 2011-11-21
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多