r****t 发帖数: 10904 | 1 非 template 情况似乎比较清楚了,class template 里面的 static data
member 的定义和初始化有没有啥龟腚?
举个例子:
template
class StackWithCapacity : public stack_adapter
{
public:
typedef typename stack_adapter< Container>::size_type size_type;
private:
static const size_type capacity = 5;
};
capacity 是个 static const member, 我就直接在 class body 里面初始化了,
据 c++ primer,class body 外面还必须 define without initializer (虽然我我不这么做也能编译并运行正常). 这样我就在外面加
template
StackWithCapacity::capacity; // line 38
没想到编译不过(看不懂出错信息):
stackset.cpp:38: error: expected constructor, destructor, or type conversion
before ';' token
问题:1. 这个地方如何写才正确?2.如果不是 const, 就是 static size_type
capacity; 的话,应该在哪个地方 intialize and/or define?
谢谢!最小代码贴在后面:
// main.cpp
#include
#include
#include
#include
#include "stack.h"
using namespace std;
template
class StackWithCapacity : public stack_adapter< Container >
{
public:
// as .size method need access to size_type
typedef typename stack_adapter::size_type size_type;
typedef typename stack_adapter::value_type value_type;
bool isAtCapacity () {
return this->size() >= capacity;
}
void push( const value_type &value ) {
if (!isAtCapacity() )
stack_adapter< Container >::push( value );
else
cout << "error: stack full..." << endl;
}
private:
static const size_type capacity = 5;
};
template
size_type StackWCap::capacity;
int main(int argc, char* argv[]){}
//stack.h:
#ifndef STACK_H
#define STACK_H
template
class stack_adapter
{
private:
typedef T container_type;
container_type m_stack;
public:
typedef typename T::value_type value_type;
typedef typename T::size_type size_type;
void push(const value_type & value) {
this->m_stack.push_front( value );
}
void pop() {
this->m_stack.pop_front();
}
const value_type & top() const {
return this->m_stack.front(); // this is undefined when m_stack is empty
}
value_type & top() {
return this->m_stack.front();
}
size_type size() {
return this->m_stack.size();
}
};
#endif
|
t****t 发帖数: 6806 | 2 你定义对象不给类型的?
化有没有啥龟腚?举个例子:
【在 r****t 的大作中提到】 : 非 template 情况似乎比较清楚了,class template 里面的 static data : member 的定义和初始化有没有啥龟腚? : 举个例子: : template : class StackWithCapacity : public stack_adapter : { : public: : typedef typename stack_adapter< Container>::size_type size_type; : private: : static const size_type capacity = 5;
|
r****t 发帖数: 10904 | 3 太乌龙了,可是
template
StackWithCapacity::size_type StackWithCapacity::
capacity;
or
template
size_type StackWithCapacity::capacity;
也出一模一样的错误,这个我实在是搞不懂。。
【在 t****t 的大作中提到】 : 你定义对象不给类型的? : : 化有没有啥龟腚?举个例子:
|
t****t 发帖数: 6806 | 4 template
typename StackWithCapacity::size_type StackWithCapacity::capacity;
太乌龙了,可是
template
StackWithCapacity::size_type StackWithCapacity::
capacity;
or
template
size_type StackWithCapacity::capacity;
也出一模一样的错误,这个我实在是搞不懂。。
【在 r****t 的大作中提到】 : 太乌龙了,可是 : template : StackWithCapacity::size_type StackWithCapacity:: : capacity; : or : template : size_type StackWithCapacity::capacity; : 也出一模一样的错误,这个我实在是搞不懂。。
|
r****t 发帖数: 10904 | 5 看到解答才惊觉此问好像在板上问过三四次了,幸苦师父了!
【在 t****t 的大作中提到】 : template : typename StackWithCapacity::size_type StackWithCapacity::capacity; : : 太乌龙了,可是 : template : StackWithCapacity::size_type StackWithCapacity:: : capacity; : or : template : size_type StackWithCapacity::capacity;
|
y**b 发帖数: 10166 | 6 这个问题c++ primer就强调了必须用typename显式告诉编译器这是一个类型,
否则可能当作一个数据成员。
【在 r****t 的大作中提到】 : 非 template 情况似乎比较清楚了,class template 里面的 static data : member 的定义和初始化有没有啥龟腚? : 举个例子: : template : class StackWithCapacity : public stack_adapter : { : public: : typedef typename stack_adapter< Container>::size_type size_type; : private: : static const size_type capacity = 5;
|