【发布时间】:2022-02-01 07:21:43
【问题描述】:
我想写一个简单的demo,但是编译失败,找不到原因。
#include <iostream>
#include <vector>
#include <list>
using namespace std;
template <
typename T,
template <typename W> typename Container = std::vector
>
class myclass
{
public:
Container<T> myc;
public:
void func();
myclass()
{
for (int i = 0; i < 10; ++i)
{
myc.push_back(i);
}
}
};
template <
typename T,
template <typename W> typename Container
>
void myclass<T, Container>::func()
{
cout << "good!" << endl;
}
int main()
{
myclass<int, vector> mylistobj2;
mylistobj2.func();
return 0;
}
编译原因是这样的
tmp.cpp: In function ‘int main()’:
tmp.cpp:100:30: error: type/value mismatch at argument 2 in template parameter list for ‘template<class T, template<class W> class Container> class _nmsp1::myclass’
100 | _nmsp1::myclass<double, list> mylistobj2;
| ^
tmp.cpp:100:30: note: expected a template of type ‘template<class W> class Container’, got ‘template<class _Tp, class _Alloc> class std::__cxx11::list’
tmp.cpp:101:13: error: request for member ‘func’ in ‘mylistobj2’, which is of non-class type ‘int’
101 | mylistobj2.func();
【问题讨论】:
-
The
std::vectortemplate 不接受单个模板参数。std::list也没有。不要使用模板模板参数,而是使用普通模板参数,比如普通的typename Container。然后在使用模板时使用正确的类型,例如myclass<std::list<double>>。如果您需要存储在容器中的类型(而不是您的T),请使用Container::value_type。 -
还有一个关于写好问题的说明:确保你得到的错误实际上与你显示的代码相匹配!你的没有。创建您的minimal reproducible example,然后复制粘贴该示例中的错误。
-
用
-std=c++17编译就可以了。 -
@PasserBy:虽然Demo没有clang。
标签: c++ list templates vector compiler-errors