类模板实例化错误
Class template instantiation errors
下面的.hpp文件编译时没有任何错误或警告:
#ifndef CODE_HPP
#define CODE_HPP
#include <array>
#include <vector>
using std::vector;
using std::array;
//stack template definition
template<typename T, typename C = vector<T>>
class stack{
C pile;
static const size_t max_sz = 10;
stack();
~stack();
void push (T&);
T& pop (void);
size_t size (void);
bool is_full (void);
friend class stack_array;
};
//stack_array template definition
template<typename T, typename C = vector<T>, typename K = stack<T, C>>
class stack_array{
private:
static const size_t max_elem = 10;
array<K, max_elem> store;
size_t curr_idx;
bool is_full (void);
public:
stack_array(T&);
~stack_array();
void push (T&);
T& pop (void);
};
//stack methods
//need a default constructor to define an array of stack objects
template<typename T, typename C> stack<T,C>::stack(){
}
template<typename T, typename C> stack<T,C>::~stack(){
}
template<typename T, typename C> void stack<T,C>::push(T& _data){
pile.push_back(_data);
return;
}
template<typename T, typename C>T& stack<T,C>::pop(void){
return(pile.pop_back());
}
template<typename T, typename C> size_t stack<T,C>::size(void){
return(pile.size());
}
template<typename T, typename C> bool stack<T,C>::is_full(void){
return(pile.size() == max_sz);
}
//stack_array methods
//template<typename T, typename C = vector<T>, typename K = stack<T, C>>
template<typename T, typename C, typename K>
stack_array<T,C,K>::stack_array(T& _data){
curr_idx = 0;
store[curr_idx].push(_data);
}
template<typename T, typename C, typename K>
//template<typename T, typename C = vector<T>, typename K = stack<T, C>>
stack_array<T,C,K>::~stack_array(){
}
template<typename T, typename C, typename K>
//template<typename T, typename C = vector<T>, typename K = stack<T, C>>
void stack_array<T,C,K>::push(T& _data){
if(!store[curr_idx].is_full()){
store[curr_idx].push(_data);
}
else{
if(!is_full())
{
++curr_idx;
store[curr_idx].push(_data);
}
}
return;
}
template<typename T, typename C, typename K>
T& stack_array<T,C,K>::pop(void){
//should return the last pushed entry
return(store[curr_idx].pop());
}
template<typename T, typename C, typename K>
bool stack_array<T,C,K>::is_full(void){
return(store.size() == max_elem);
}
#endif
但是,如果main()
中仅有的两行未添加注释:
#include "code.hpp"
#include <string>
#include <iostream>
using std::string;
using std::to_string;
using std::cout;
int main (void){
//string s = "";
//stack_array<string> s_a(s);
return 0;
}
所有的地狱都松动了,我得到了一堆错误:
code.hpp: In instantiation of ‘class stack<std::basic_string<char>, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > >’:
/usr/lib/gcc/x86_64-pc-cygwin/7.4.0/include/c++/array:110:56: required from ‘struct std::array<stack<std::basic_string<char>, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > >, 10>’
code.hpp:28:28: required from ‘class stack_array<std::basic_string<char> >’
main.cpp:11:30: required from here
code.hpp:13:25: error: template argument required for ‘class stack_array’
static const size_t max_sz = 10;
^~~~~~
code.hpp: In instantiation of ‘stack_array<T, C, K>::stack_array(T&) [with T = std::basic_string<char>; C = std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > >; K = stack<std::basic_string<char>, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > >]’:
main.cpp:11:30: required from here
code.hpp:68:41: error: use of deleted function ‘std::array<stack<std::basic_string<char>, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > >, 10>::array()’
stack_array<T,C,K>::stack_array(T& _data){
^
In file included from code.hpp:3:0:
/usr/lib/gcc/x86_64-pc-cygwin/7.4.0/include/c++/array:94:12: note: ‘std::array<stack<std::basic_string<char>, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > >, 10>::array()’ is implicitly deleted because the default definition would be ill-formed:
struct array
^~~~~
/usr/lib/gcc/x86_64-pc-cygwin/7.4.0/include/c++/array:94:12: error: ‘stack<T, C>::stack() [with T = std::basic_string<char>; C = std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > >]’ is private within this context
code.hpp:42:34: note: declared private here
template<typename T, typename C> stack<T,C>::stack(){
^~~~~~~~~~
In file included from code.hpp:3:0:
/usr/lib/gcc/x86_64-pc-cygwin/7.4.0/include/c++/array:94:12: error: ‘stack<T, C>::~stack() [with T = std::basic_string<char>; C = std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > >]’ is private within this context
struct array
^~~~~
code.hpp:45:34: note: declared private here
template<typename T, typename C> stack<T,C>::~stack(){
^~~~~~~~~~
code.hpp:68:41: error: use of deleted function ‘std::array<stack<std::basic_string<char>, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > >, 10>::~array()’
stack_array<T,C,K>::stack_array(T& _data){
^
In file included from code.hpp:3:0:
/usr/lib/gcc/x86_64-pc-cygwin/7.4.0/include/c++/array:94:12: note: ‘std::array<stack<std::basic_string<char>, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > >, 10>::~array()’ is implicitly deleted because the default definition would be ill-formed:
struct array
^~~~~
/usr/lib/gcc/x86_64-pc-cygwin/7.4.0/include/c++/array:94:12: error: ‘stack<T, C>::~stack() [with T = std::basic_string<char>; C = std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > >]’ is private within this context
code.hpp:45:34: note: declared private here
template<typename T, typename C> stack<T,C>::~stack(){
^~~~~~~~~~
code.hpp:70:5: error: ‘void stack<T, C>::push(T&) [with T = std::basic_string<char>; C = std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > >]’ is private within this context
store[curr_idx].push(_data);
^~~~~
code.hpp:48:39: note: declared private here
template<typename T, typename C> void stack<T,C>::push(T& _data){
^~~~~~~~~~
code.hpp: In instantiation of ‘stack_array<T, C, K>::~stack_array() [with T = std::basic_string<char>; C = std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > >; K = stack<std::basic_string<char>, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > >]’:
main.cpp:11:30: required from here
code.hpp:76:1: error: use of deleted function ‘std::array<stack<std::basic_string<char>, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > >, 10>::~array()’
}
^
我不确定模板类的设计是否存在根本性错误,或者与实例化时的错误有关。
欣赏你的想法。
您正在使用未声明size_t
。您应该说 using std::size_t
或将其限定为 std::size_t
,或者包含标头以声明非限定名称 <stddef.h>
。
您还试图通过将其声明为类来stack_array
成为朋友,但它是一个类模板,而不仅仅是一个类:
friend class stack_array;
您需要将其声明为模板:
template<typename T, typename C, typename K>
friend class stack_array;
相关文章:
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 错误的cv::face FacemarkLBF实例化
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- gcc出现不明确的模板实例化错误
- 尝试实例化模板类的对象时出现"No Matching Constructor"错误
- 无法实例化抽象类错误
- 错误 C2280 / 在 std::vector 中实例化对象时复制构造函数出现问题?
- 模板实例化分析错误
- unique_ptr 使用尚未定义的参数进行实例化不会导致错误
- 与模板实例化相关的编译错误
- 从模板实例化/类型推断中查找错误消息的实际来源
- 类模板实例化错误
- 错误 C2908:显式专用化; 已被实例化
- C++11 列出 push_back() 实例化错误
- 如何修复错误C2259:无法实例化抽象类
- 使用非量表类型实例化模板时修复编译错误
- 由于命名空间而导致的对象实例化错误
- 无法在好友函数中实例化类?我没有得到在范围错误中声明
- 实例化对象时如何修复分段故障错误
- 将 SFINAE 上下文中不正确的模板实例化的硬错误转变为软错误