我一直在寻找互联网和stackoverflow的具体答案,但我似乎无法找到一个.我必须创建一个泛型类,然后实现特定的功能.我的具体说明是:您需要使用模板表达式参数和模板类专业化和部分专业化.
我有一个模板类:
template <class T, int x, int y>
class Z {
T **array[x][y];
public:
Z();
void print();
//and other methods
};
Run Code Online (Sandbox Code Playgroud)
我需要:
1)只有Z的,其中x = 2和y = 2需要有一个公共方法void J()
2)对于x = 2且y = 2 J的char Z,它会做某事; 对于其他一切,它做了别的事
3)对于只有Z是char的字符,将数组初始化为某个值.其他一切都是0
当然,这有效:
template<class T, int x, int y>
Z<T,x,y>::Z<T,x,y>() { //initialize to 0 }
Run Code Online (Sandbox Code Playgroud)
但这不是:
template<int x, int y>
Z<char,x,y>::Z<char,x,y>() { //initialize to something}
Run Code Online (Sandbox Code Playgroud)
同样(假设J存在)这不起作用:
template <class T>
void Z<T,2,2>::J() { //something }
Run Code Online (Sandbox Code Playgroud)
我的问题是:
有没有简单的方法来实现上述项目?我需要在Z中保留所有其他方法.给出一个提示或指向正确的方向(也许我错过了一个问题,因为有很多)会有所帮助.
谢谢.
在我的for循环中声明迭代器时研究无符号与有符号整数比较警告时,我读到了这个:
尽可能使用您要比较的确切类型(例如,
std::string::size_type与std::string长度比较时使用).
我QList<T>想要迭代,使用上面的方法声明迭代器:
for(QList::size_type i = 0; i < uploads.size(); i++)
{
//Do something
}
Run Code Online (Sandbox Code Playgroud)
它给了我一个编译器错误:
error: 'template<class T> class QList' used without template parameters
for(QList::size_type i = 0; i < uploads.size(); i++)
Run Code Online (Sandbox Code Playgroud)
为什么我不能以同样的方式使用它?这是由我还是由Qt框架及其类型引起的?QList::size_type在这种情况下,什么是一个很好的替代品,QList::size()只需返回一个常规的旧的int,我想使用它; 但我读了上面链接的帖子,这让我不确定.
以下两个片段有什么区别?
<T>for 运算符 <<template<typename T>
class Stack {
...
friend std::ostream& operator<< <T> (std::ostream&,
Stack<T> const&);
};
Run Code Online (Sandbox Code Playgroud)
<T>template<typename T>
class Stack {
...
friend std::ostream& operator<< (std::ostream&,
Stack<T> const&);
};
Run Code Online (Sandbox Code Playgroud) 我正在学习 C++ 中的模板。特别是,我在这里看到我们可以对构造函数进行以下声明:
template<typename T>
struct Rational
{
Rational<T>();
};
Run Code Online (Sandbox Code Playgroud)
但上面的代码片段在 C++2a 中编译失败,在 C++17 中编译成功。
这是编译器错误还是有原因导致它无法针对 C++2a 和 C++2b 进行编译。如果有原因的话,那是什么原因呢?我想知道标准中的哪些子句(如果有)允许/阻止以下示例进行编译。由于我已经使用 C++17 和 C++20 测试了上面的示例,因此我只寻找这两个标准版本的引用。
当我注意到一种这样的情况(如下所示)在 clang 和 msvc 中编译良好但在 gcc 中编译失败时,我试图显式地专门化一个成员函数模板。这是验证相同内容的链接:https ://godbolt.org/z/15z4nT5Kx
struct C
{
template<typename T>
void f()
{
}
template<> void f<int>()
{
}
};
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
从上面的链接中可以看出,clang 和 msvc 编译程序没有任何问题,但 gcc 说:
<source>:10:14: error: explicit specialization in non-namespace scope 'struct C'
10 | template<> void f<int>()
| ^
<source>:10:21: error: template-id 'f<int>' in declaration of primary template
10 | template<> void f<int>()
| ^~~~~~
Run Code Online (Sandbox Code Playgroud)
这里是哪个编译器?
我有一个像这样的模板类:
template<typename T, unsigned int size>
class Array
{
public:
static const unsigned int SIZE = size;
// ...
private:
T data[SIZE];
};
Run Code Online (Sandbox Code Playgroud)
有没有办法添加编译时检查,使 an 的大小Array<T,XXXX>永远不会超过某个值?
就像如果该值为512,则不应编译:
Array<int, 1000> arr;
C++ 化我的代码的想法对我来说是新的,所以我愿意接受任何指南或在线进一步学习来帮助解决这个问题,因为我什至不知道要谷歌搜索什么。我尝试过的一切似乎都还很遥远。
c++ templates class-template c++17 compile-time-type-checking
我在 myclass.hpp 中有一个类模板:
template<class T, class P>
class myclass
{
....
};
Run Code Online (Sandbox Code Playgroud)
在我的 main.cc 中,我创建了该类的一个对象:
myclass<int, double> mc;
otherfunc<myclass>(mc);
Run Code Online (Sandbox Code Playgroud)
在其他一些头文件header1.hpp中:
template<class MyClass>
void otherfunc(MyClass const &mc)
{
/* Access through 'mc' the underlying template parameters T and P*/
}
Run Code Online (Sandbox Code Playgroud)
如何访问 header1.hpp 中的模板参数 T 和 P?
我想知道std::enable_ifoverstatic_asserts防止模板实例化的优势。这个答案表明,这std::enable_if允许SFINAE,这在函数模板的情况下是一个令人信服的论点。
然而,这个论点对于类模板(和变量模板)是否合法?据我所知,那里不涉及重载决议,这使得 SFINAE - 再次,据我所知 - 不相关,但我可能是错的。如果是这样,你能举一个例子吗?
如果不是,我认为static_assert在类模板的情况下是给定问题(防止模板实例化)的更好解决方案,因为它可以说更明确、简洁和可读,并允许自定义错误消息。这是正确的还是我错过了 SFINAE 以外的一点?
我看到这个关于 SO 的问题的答案,该问题与类模板的默认构造函数的声明相关,该声明表示由于CWG1435,以下代码不是有效的 C++ :
template <class T> class Stack {
public:
Stack<T>(); //IS THIS VALID?
};
Run Code Online (Sandbox Code Playgroud)
而另一个答案说上面的例子是有效的C++。有两个来源可以证明上述示例有效:
否则,它被视为类型名称,相当于模板名称后跟 <> 中包含的类模板的模板参数
因此,正如我们所看到的,两个链接的答案提出了相反的主张,我不知道哪一个是正确的。所以我的问题是这两个答案哪个是正确的。也就是说,声明Stack<T>();是否有效 C++。
PS:我问的是 C++11 及以后的现代 C++ 含义。
C++ 有一个有用的功能,即模板参数隐含在模板类内的代码中A。然而,对于建筑来说,这似乎与 CTAD 发生冲突。
如何让 CTAD 优先?
例如,在这里,成员中有一个错误f,因为A它被解释为A<T>where Tis std::string,而不是从参数 推导出来double。
#include<string>
template<class T>
struct A {
A(T const& t) {}
auto f() {return A{5.0};} // error here triggered by line 11 `auto a2 = a1.f();`
};
int main() {
A a1{std::string{"hello"}};
auto a2 = a1.f();
}
Run Code Online (Sandbox Code Playgroud)