0

テンプレート クラスを使用して最初のプロジェクトをコンパイルする際に問題が発生し、次のようなテンプレート クラスに起因するすべてのエラーが発生します。

In file included from CountArray.h:1:0,
             from Executive.h:2,
             from main.cpp:3:
Count.h:10:5: error: ISO C++ forbids declaration of 'T' with no type [-fpermissive]
   T();
     ^
Count.h:10:3: error: declaration of 'int Count<T>::T()'
   T();
   ^
Count.h:4:11: error:  shadows template parm 'class T'
 template <typename T>
           ^
Count.h:11:4: error: typedef-name 'T' used as destructor declarator
   ~T();
    ^
Count.h:11:6: error: declaration of '~T' as member of 'Count<T>'
   ~T();
      ^
Count.h:12:3: error: 'T' does not name a type
   T getItem();
   ^

などなど。私は2つのテンプレートクラスを持っています.

template <typename T>
Count<T>::T(){
item=new Count<T>;
count=1;
}  

template <typename T>
Count<T>::~T(){
delete item;
}

template <typename T>
//needs type declaration, error for it being T type
T Count<T>::getItem(){
return item;
}

template<typename T>
void Count<T>::setCount(){
count++;
}

template <typename T>
int Count<T>::getCount(){
    return count;
}

ヘッダーファイルを持つ別のもの

#include "Count.h"
#ifndef COUNTARRAY_H
#define COUNTARRAY_H
template <typename T>
class CountArray{
private:
    Count<T>* array;
    int arraySize; // initially: 10
    int numItemsStored=0;
public:
    CountArray();
    CountArray(const CountArray<T>& countArr);
    ~CountArray();

    void bumpCount(T t);
    int getNumItemsStored() const;
    Count<T> getItem(int whichItem) const;
    int getCount(int whichItem) const;
    void print();
    int setArraySize(int size);
    int getArraySize();
    void doubleArraySize();
};

#include "CountArray.cpp"
#endif

エグゼクティブによって呼び出されるインスタンスがあります。

#include <fstream>
#include "CountArray.h"

class Executive{
private:
    CountArray<char> charArray;
    CountArray<int> intArray;
    CountArray<std::string> strArray;

    template <typename T>
    static void print(CountArray<T> arr); // arr MUST be passed by value

    template <typename T>
    static void read(std::istream& is, CountArray<T>& arr);

public:
    Executive(std::istream& charFile, std::istream& intFile,
              std::istream& stringFile);

    void print() const;
};

そしてメインファイル:

#include <iostream>
#include <fstream>
#include "Executive.h"

//Get file names
int main(int argc, char* argv[]){

std::ifstream charFin, intFin, stringFin;

//open file, check if open, then continue if so.
charFin.open(argv[1]);
if(charFin.is_open()){
    argv[1].read(charFin, charArray);
}
else{
    std::cout <<"Unable to open " <<argv[1] <<std::endl;
    return -1;
}

intFin.open(argv[2]);
if(intFin.is_open()){
    argv[2].read(intFin, intArray);
}
else{
    std::cout <<"Unable to open " <<argv[2] <<std::endl;
    return -1;  
}

stringFin.open(argv[3]);
if(stringFin.is_open()){
    argv[3].read(stringFin, strArray);
}
else{
    std::cout <<"Unable to open " <<argv[3] <<std::endl;
    return -1;
}
Executive exec(charFin, intFin, stringFin);
exec.print();
return 0;
}

これらのエラーをどこでどのように修正するかはわかりませんが、それらがテンプレートに関連していることは知っています。これは非常に狭い質問であることは理解していますが、同様のエラーを抱えている他の人に役立つことを願っています。同じルート化の問題。

4

1 に答える 1

0
template <typename T>
Count<T>::T(){
item=new Count<T>;
count=1;
}  

する必要があります

template <typename T>
Count<T>::Count(){
item=new Count<T>;
count=1;
}

于 2013-10-04T03:58:49.007 に答える