C++;模板化类默认构造函数失败 >我正在为C++中的赋值创建一个栈类。作业的核心是让我们熟悉模板。我已经一遍又一遍地读了我的书,在这里一个问题一个问题地看

C++;模板化类默认构造函数失败 >我正在为C++中的赋值创建一个栈类。作业的核心是让我们熟悉模板。我已经一遍又一遍地读了我的书,在这里一个问题一个问题地看,c++,templates,constructor,C++,Templates,Constructor,我需要让我的堆栈类能够由 Stack s2; 但是我在编译test.cpp时出错,并且只能在构造为时编译 Stack<T> s1; test.cpp #include <iostream> #include <vector> #include <stdlib.h> #include <string> #include "Stack.cpp" using namespace std; int main() { Stac

我需要让我的堆栈类能够由

Stack s2;
但是我在编译test.cpp时出错,并且只能在构造为时编译

Stack<T> s1;

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();
}
#包括
#包括
#包括
#包括
#包括“Stack.cpp”
使用名称空间std;
int main(){
堆栈s1;
s1.推送(“值1”);
s1.推送(“值2”);
s1.Print();
堆栈s2;
s2.推送(“值1”);
s2.推送(“值2”);
s2.Print();
}

默认模板参数如何

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

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

而不是模板化所有内容,您可以使用一个变体类型的堆栈(从C++17开始,在使用之前)。使用下面的代码,您现在可以将
int
double
std::string
推送到堆栈上。此外,
Pop()
缺少返回语句。另外,向量的
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();
}
#包括
#包括
#包括
#包括
类堆栈{
使用Variant=std::Variant;
公众:
堆栈();
无效推送(变量val);
void Pop();
作废打印();
私人:
std::vector-vecT;
};
堆栈::堆栈():向量(){}
void Stack::Push(Variant val){vecT.Push_back(val);}
void Stack::Pop(){vecT.Pop_back();}
void Stack::Print(){

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

template<typename T = int> 
class Stack {
模板
类堆栈{
然后,您可以使用以下方法进行构造:

Stack<> s2;
stacks2;

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

这将成为
Stack s2;
Stack s2
不会编译,除非您有C++1Z。这不会为我编译。@Zhawn您启用了C++17吗?我想我没有。我为您安装了正常的g++编译器LinuxMint大约一个月前离开了正常设置?@Zhawn更新答案的第二部分现在包含了一个与C++98兼容的解决方案。
#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();
}
#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();
}
template<typename T = int> 
class Stack {
Stack<> s2;