0

C++ でテンプレートを使用してからしばらく経ちましたが、今では本当に必要になっています。

発生している問題を再現しましたが、実際にどのように解決したか覚えていません。

#include <iostream>
#include <vector>

namespace problem {
    template <typename T>
    class data {
        public:
            inline data(T var) {
                this->var = var;
            }
        private:
            T var;
    };

    class storage {
        public:
            inline void push(problem::data<T> * data) {
                this->VData.push_back(data);
            }
        private:
            std::vector<problem::data<T> *> VData;
    };
};

int main() {
    problem::storage * testStorage = new problem::storage();
    problem::data<int> * testData = new problem::data<int>(256);

    testStorage->push(testData);

    delete testData;
    delete testStorage;
    return 0;
}

g++ -Wall problem.cpp で次のエラーが表示されます。

problem.cpp:17:35: error: ‘T’ was not declared in this scope
problem.cpp:17:36: error: template argument 1 is invalid
problem.cpp:21:30: error: ‘T’ was not declared in this scope
problem.cpp:21:31: error: template argument 1 is invalid
problem.cpp:21:34: error: template argument 1 is invalid
problem.cpp:21:34: error: template argument 2 is invalid
problem.cpp: In member function ‘void problem::storage::push(int*)’:
problem.cpp:18:17: error: request for member ‘push_back’ in ‘((problem::storage*)this)->problem::storage::VData’, which is of non-class type ‘int’
problem.cpp: In function ‘int main()’:
problem.cpp:29:28: error: no matching function for call to ‘problem::storage::push(problem::data<int>*&)’
problem.cpp:29:28: note: candidate is:
problem.cpp:17:16: note: void problem::storage::push(int*)
problem.cpp:17:16: note:   no known conversion for argument 1 from ‘problem::data<int>*’ to ‘int*’

メンバー テンプレートを使用できることはわかっていますが、ベクターをどうするのでしょうか?

template <typename T>
inline void push(problem::data<T> * data) {
    this->VData.push_back(data);
}

メンバー テンプレートを使用すると、ベクトル定義でこれらのエラーが残ります。

problem.cpp:22:30: error: ‘T’ was not declared in this scope
problem.cpp:22:31: error: template argument 1 is invalid
problem.cpp:22:34: error: template argument 1 is invalid
problem.cpp:22:34: error: template argument 2 is invalid
problem.cpp: In member function ‘void problem::storage::push(problem::data<T>*)’:
problem.cpp:19:17: error: request for member ‘push_back’ in ‘this->.VData’, which is of non-class type ‘int’
4

4 に答える 4

2

たぶんboost::anyを使ってみては?

#include <iostream>
#include <vector>
#include <boost/any.hpp>

namespace problem {
    template <typename T>
    class data {
        public:
            inline data(T var) {
                this->var = var;
            }
        private:
            T var;
    };

    class storage {
        public:
            template<class T>
            inline void push(problem::data<T> * data) {
                this->VData.push_back(data);
            }
        private:
            std::vector<boost::any> VData;
    };
};

int main() {
    problem::storage * testStorage = new problem::storage();
    problem::data<int> * testData = new problem::data<int>(256);

    testStorage->push<int>(testData);

    problem::data<float> * testData1 = new problem::data<float>(1.);
    testStorage->push<float>(testData1);

    delete testData;
    delete testData1;
    delete testStorage;
    return 0;
}

ただし、ベクターのデータを使用する前に、boost::any から型にキャストする必要があります

于 2012-07-19T12:16:23.453 に答える
1

ストレージ クラスにはテンプレート パラメーターに依存するデータ メンバーがあるため、それをクラス テンプレートにする必要があります。

template <typename T>
class storage {
    public:
        inline void push(problem::data<T> * data) {
            this->VData.push_back(data);
        }
    private:
        std::vector<problem::data<T> *> VData;
};

それ以外の場合はstorage、特定のタイプで機能させることができますT:

class storage {
    public:
        inline void push(problem::data<int> * data) {
            this->VData.push_back(data);
        }
    private:
        std::vector<problem::data<int> *> VData;
};
于 2012-07-19T11:50:43.850 に答える
-3

私が探していた解決策を見つけましたが、これが良い習慣かどうかはわかりません。:P

class storage {
    public:
        template <typename T>
        inline void push(problem::data<T> * data) {
            this->VData.push_back(reinterpret_cast<char*>(data));
        }
        template <typename T>
        inline problem::data<T> * draw() {
            problem::data<T> * data = reinterpret_cast<problem::data<T>*>(VData.back());
            return data;
        }
    private:
        std::vector<char*> VData;
};
于 2012-07-19T12:28:01.457 に答える