对于模板,我看到了两个声明:
template < typename T >
template < class T >
Run Code Online (Sandbox Code Playgroud)
有什么不同?
这些关键字在下面的例子中究竟是什么意思(取自德国维基百科关于模板的文章)?
template < template < typename, typename > class Container, typename Type >
class Example
{
Container< Type, std::allocator < Type > > baz;
};
Run Code Online (Sandbox Code Playgroud) 这个问题已在C#/ .Net的背景下提出.
现在我想学习C++中结构和类之间的区别.请讨论技术差异以及在OO设计中选择其中一个的原因.
我将从一个明显的区别开始:
public:or private:,则结构的成员默认是公共的; 默认情况下,类的成员是私有的.我确信在C++规范的模糊角落中还有其他差异.
我使用cppreference阅读了C++中的枚举声明.
然后我制作了Enum类并检查它是否是类类型或不使用std::is_class.
#include <iostream>
enum class Enum
{
red = 1, blue, green
};
int main()
{
std::cout << std::boolalpha;
std::cout << std::is_class<Enum>::value << '\n';
}
Run Code Online (Sandbox Code Playgroud)
然后我在Linux平台上编译并运行G ++编译器,它打印出false值.
所以类型是enum不是?如果枚举是一个类类型,那么为什么我会得到假值?
我看到两个不同的模板类声明:
template <class T> class SampleClass1
{
// ...
};
Run Code Online (Sandbox Code Playgroud)
和
template <typename T> class SampleClass2
{
// ...
};
Run Code Online (Sandbox Code Playgroud)
这两个代码有什么区别?
编辑:我将错误的关键字"typedef"更正为"typename".
我有使用VC9(Microsoft Visual C++ 2008 SP1)编译的代码,但没有使用GCC 4.2(在Mac上,如果这很重要).如果我填写足够的限定符和关键字,我可以强制它在GCC中工作,但这似乎不对.
这是一个展示我的问题的最小代码示例:
template< typename N >
struct B {
typedef N n_type; // can derived class access typedef?
void foo() {} // can derived class access function?
};
template< typename N >
struct D : public B<N> {
typedef B<N> b_type;
typedef typename b_type::n_type bn_type;
void f1( n_type ) {} // ERROR: 'n_type' has not been
// declared
void f2( typename B<N>::n_type ) {} // OK, verbose
void f3( b_type::n_type ) {} // ERROR: 'struct …Run Code Online (Sandbox Code Playgroud) 我们知道,struct并且class可以在语言的许多地方互换.令人困惑的是,关键字本身并不一定与标准中使用的语言相对应.例如,在草案标准N4567 [class]/10中,
甲POD结构109是一个非工会类既是琐碎类和一个标准布局类,和具有类型的非POD结构,非POD联合(或这些类型的阵列)的无非静态数据成员.类似地,POD联合是一个简单的类和标准布局类的联合,并且没有非POD结构类型的非静态数据成员,非POD联合(或这种类型的数组).甲POD类是一类可以是一个POD结构或一个POD结合.
在过于简化的术语,struct并且class是在以下情况下可以互换:
union但是,struct 显式不能在模板声明中用于引入类型模板参数:
template <struct T> // error
Run Code Online (Sandbox Code Playgroud)
我无法看到之间的任何显著差异struct和class,甚至在POD上面的例子,因为一个POD结构为界定标准,使用时请声明struct或class.
[class]/8 标准布局结构是使用类键结构或类键类定义的标准布局类.甲 标准布局联盟是与定义的标准布局类类键联合.
这引起了明显的不一致,这似乎相当多余和令人困惑.
我有两个问题:
是否有任何技术差异,我错过了明显区分struct和class?
这种笨拙背后的理由是什么?
我忽略了默认访问说明符之间的区别,因为每个人都已经知道了.
任何人都可以告诉这段代码有什么问题吗?
template<class X>
class C {
public:
template<class Y> void f(Y); // line 4
};
template<class X, class Y>
void C<X>::f(Y y) { // line 8
// Something.
}
int main() {
C<int> c;
char a = 'a';
c.f(a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
汇编:
$ g++ source.cpp
source.cpp:8: error: prototype for ‘void C<X>::f(Y)’ does not match any in class ‘C<X>’
source.cpp:4: error: candidate is: template<class X> template<class Y> void C::f(Y)
Run Code Online (Sandbox Code Playgroud)
我现在可以通过在第4行声明和定义函数来完成任务,但与单独执行相比,同时声明和定义函数的后果是什么?(这不是关于在头文件和源文件中声明函数的讨论)
注意:我已经看到了这个问题,但似乎我感兴趣的唯一部分是分开=(
我目前正在尝试使用列表类专用的节点结构在列表模板类中实现排序算法.我正在使用一些私有递归函数,它返回一个指向节点类型的指针,导致g ++给我一个声明错误.这是我所拥有的样本 -
template<class T>
class SList
{
private:
struct NODE
{
T* elem;
NODE* next;
} *_head, *_tail;
NODE* sort(NODE* node);
public:
//other declarations...
}
template<class T>
NODE* SList<T>::sort(NODE* node) //Error: 'NODE' does not name a type
{
//sorting algorithm
}
Run Code Online (Sandbox Code Playgroud)
这是c ++的限制还是我错过了什么?
我在键盘上,我正在尝试使用C++建立自己的技能.我之前从未使用过模板,所以我试着研究如何使用它们.下面的代码是结果,不幸的是,它不起作用.我确实试图寻找我的问题的解决方案,但由于我没有使用模板的经验,我无法在我的问题和其他问题之间建立任何联系.所以,我决定寻求帮助.
template <class A>
class Vector2 {
public:
A x,y;
Vector2(A xp, A yp){
this->x = xp;
this->y = yp;
}
};
template <class B, class A>
class rayToCast {
public:
rayToCast(B angle, Vector2<A> origin, Vector2<A> point1, Vector2<A> point2){
this->RAngle = angle;
this->Point1 = point1;
this->Point2 = point2;
}
private:
B RAngle;
Vector2<A> point1,point2;
};
int main(){
rayToCast<short int, float> ray(45, Vector2<float>(0.0, 0.0), Vector2<float>(-10.0, -3.0), Vector2<float>(5.0, 7.0));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
t.cpp: In constructor 'rayToCast<B, A>::rayToCast(B, Vector2<A>, Vector2<A>, Vector2<A>) [with …Run Code Online (Sandbox Code Playgroud) 为什么这不起作用?
template <typename T, typename U>
class TSContainer {
private:
U<T> container;
};
Run Code Online (Sandbox Code Playgroud)
称为:
TSContainer<int, std::vector> ts;
Run Code Online (Sandbox Code Playgroud)
我认为解决方案可能是:
template <typename T, template <typename> typename C>
class TSContainer
{
C<T> container;
};
Run Code Online (Sandbox Code Playgroud)
但这也不起作用.