c++ - 将模板类作为参数传递给类方法并使用模板类作为 vector 模板类型

标签 c++

我已经有一段时间没有在 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*’

我知道我可以使用成员模板,但我如何处理 vector ?

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

如果我使用成员模板,那么 vector 定义将留下这些错误。

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’

最佳答案

如果你想要存储不止一种类型的值,你可以尝试这样的事情:http://ideone.com/jjuVq

class storage {
    struct data_base {};

    template <class K> 
    struct data: data_base {
        data(K value): value_(value) {}
        K value_;
    };

    typedef std::vector<data_base*> container_type;

public:
    ~storage() {
        while(!this->VData.empty()) {
            delete this->VData.back();
            this->VData.pop_back();
        }
    }
    template <class P>
    inline void push(P v) {
        this->VData.push_back(new data<P>(v));
    }
    template <class P>
    P &get(int i) { return static_cast<data<P>*>(this->VData[i])->value_; }
private:
    container_type VData;
};

或者只使用 boost::any 作为容器的值类型。

关于c++ - 将模板类作为参数传递给类方法并使用模板类作为 vector 模板类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11560098/

相关文章:

c++ - 更新到macOS Catalina后无法使用C++代码编译R软件包

c++ - C++11 优先级队列中的继承类

c++ - 如何高效实现任意序列的按位旋转?

c++ - 如何将 CUDA 集成到现有的类结构中?

c++ - 模板和方法特化

c++ - 为什么不能简单初始化(带大括号)2D std::array?

c++ - 如何为多线程应用程序制作全局对象

c++ - 在 glReadPixels 调用后丢失

c++ - 别名模板的部分特化

c++ - 动态规划 - 分词