以下2种语法之间有什么区别:
template<int N> struct A; // (1)
Run Code Online (Sandbox Code Playgroud)
和
template<const int N> struct A; // (2)
Run Code Online (Sandbox Code Playgroud)
何时使用每种语法的一般准则?
我正在编写一个CustomVector类,使用标准向量在内部存储数据:
template <class T>
class CustomVector {
friend class CustomVector_ref<T>;
public:
...
private:
std::vector<T> _data;
};
Run Code Online (Sandbox Code Playgroud)
然后,为了从CustomVector中提取子向量,我使用一个存储指向每个数据元素的指针的类:
template <class T>
class CustomVector_ref {
public:
//Returns the value stored in CustomVector
//and pointed-to by _data_ref
T& operator[] (size_t id) { return *_data_ref[id] }
const T& operator[] const (size_t id) { return *_data_ref[id] }
...
private:
std::vector<T*> _data_ref;
};
Run Code Online (Sandbox Code Playgroud)
现在,为了说明我的问题,考虑简单的构造函数构建对CustomVector的所有元素的引用就足够了
template<class T>
CustomVector_ref<T>::CustomVector_ref(CustomVector<T>& cv)
{
for (T& el : cv._data)
_data_ref.push_back(&el);
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但如果我有一个const CustomVector,我还需要定义构造函数:
template<class T>
CustomVector_ref<T>::CustomVector_ref(const CustomVector<T>& cv)
{
for (const …Run Code Online (Sandbox Code Playgroud) 以下构造的实际效果是什么:
class Base { /* ... */ };
template<class T>
class Derived : public T { /* ... */ };
int main() {
Derived<const Base> d;
// ...
}
Run Code Online (Sandbox Code Playgroud)
Derived该类是否只能访问const接口的-part Base?我的第一次测试表明实际上根本没有效果.为什么?
谢谢!