C ++模板类默认构造函数失败

时间:2017-06-19 20:32:15

标签: c++ templates constructor

所以我正在为C ++中的赋值创建一个Stack类。任务的核心是让我们熟悉模板。我一遍又一遍地看完了我的书,在这里看了一个问题。

我需要让我的Stack类能够由

构建
Stack s2;

但是在编译test.cpp时遇到错误,只能在构造为

时编译
Stack<T> s1;

其中Tstd::stringint等。如何构建我的堆栈以便我可以使用这两个构造函数?

Stack.cpp

#include <iostream>
#include <vector>
#include <stdlib.h>
#include <string>

using namespace std;

template<typename T> 
class Stack {
public:
    Stack();
    void Push(T val);
    T Pop();
    void Print();

private:
    vector<T> vecT;
};

template <typename T>
Stack<T>::Stack() { }

template <typename T>
void Stack<T>::Push(T val) { vecT.push_back(val); }

template <typename T>
T Stack<T>::Pop() { vecT.pop_back(); }

template <typename T>
void Stack<T>::Print() {
    cout << "[ ";
    for(int i=0; i<vecT.size(); i++) {
        cout << vecT[i] << " ";
    }
    cout << "]";
}

TEST.CPP

#include <iostream>
#include <vector>
#include <stdlib.h>
#include <string>

#include "Stack.cpp"

using namespace std;

int main() {
    Stack<string> s1;
        s1.Push("values1");
        s1.Push("values2");
        s1.Print();

    Stack s2;
        s2.Push("values1");
        s2.Push("values2");
        s2.Print();
}

3 个答案:

答案 0 :(得分:1)

默认模板参数怎么样?

template<typename T = std::string> 
class Stack {

无论如何,

Stack<T> s1;

Stack s2;

你没有使用不同的构造函数;在这两种情况下,您都使用相同的默认(无参数)构造函数。

答案 1 :(得分:0)

不是模板化所有内容,而是使用变量类型的堆栈(因为C ++ 17,在使用之前Boost.Variant)。使用下面的代码,您现在可以将intdoublestd::string推送到堆栈中。此外,Pop()缺少一个return语句。此外,向量的pop_back()不会返回任何内容。

#include <iostream>
#include <vector>
#include <string>
#include <variant>

class Stack {
    using Variant = std::variant<int,double,std::string>;
public:
    Stack();
    void Push(Variant val);
    void Pop();
    void Print();

private:
    std::vector<Variant> vecT;
};

Stack::Stack() : vecT() {}

void Stack::Push(Variant val) { vecT.push_back(val); }

void Stack::Pop() { vecT.pop_back(); }

void Stack::Print() {
    std::cout << "[ ";
    for ( auto const& v : vecT )
        std::visit([] (auto&& arg) { std::cout << arg << " "; }, v);
    std::cout << "]\n";
}

int main() {
    Stack s1;
        s1.Push("values1");
        s1.Push("values2");
        s1.Print();

    Stack s2;
        s2.Push("values1");
        s2.Push("values2");
        s2.Print();
}

使用Boost.Variant,您将获得与C ++ 98兼容的解决方案。

#include <iostream>
#include <vector>
#include <string>
#include <boost/variant.hpp>

class Stack {
    typedef boost::variant<int,double,std::string> Variant;
    typedef std::vector<Variant>::iterator Iterator;

    std::vector<Variant> vecT;

    struct visitor : public boost::static_visitor<void>
    {
        template < typename T >
        void operator()(T const& arg) const { std::cout << arg << " "; }
    };
public:
    Stack();
    void Push(Variant val);
    void Pop();
    void Print();
};

Stack::Stack() : vecT() {}

void Stack::Push(Variant val) { vecT.push_back(val); }

void Stack::Pop() { vecT.pop_back(); }

void Stack::Print() {
    std::cout << "[ ";
    for ( Iterator it = vecT.begin(); it != vecT.end(); ++it )
        boost::apply_visitor( visitor(), *it );
    std::cout << "]\n";
}

int main() {
    Stack s1;
        s1.Push("values1");
        s1.Push("values2");
        s1.Print();

    Stack s2;
        s2.Push("values1");
        s2.Push("values2");
        s2.Print();
}

答案 2 :(得分:0)

您可以使用默认模板参数:

template<typename T = int> 
class Stack {

然后你可以使用:

构建
Stack<> s2;

此外,构造函数是相同的,您每次都不会调用另一个,而是模板参数不同。