Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我们使用C++中的模板之类的变量时,它意味着什么? 我正在读一本C++书。我遇到一个类似于以下内容的代码: int foo=3; if(foo<1>(3)) cout<<"hello world!"<<endl;_C++ - Fatal编程技术网

当我们使用C++中的模板之类的变量时,它意味着什么? 我正在读一本C++书。我遇到一个类似于以下内容的代码: int foo=3; if(foo<1>(3)) cout<<"hello world!"<<endl;

当我们使用C++中的模板之类的变量时,它意味着什么? 我正在读一本C++书。我遇到一个类似于以下内容的代码: int foo=3; if(foo<1>(3)) cout<<"hello world!"<<endl;,c++,C++,这绝对是一个奇怪的代码,所以如果这本书没有解释它,就烧掉这本书并要求退款。总结是:它不是一个模板。这是一个小于的比较,也是一个大于的比较 if(foo<1>(3)) 您可能希望它使用默认构造的a创建一个名为obj的B,但它声明了一个名为obj的函数,该函数返回一个B,它的参数本身就是一个不接受任何内容并返回一个a的函数。然后,当您尝试将其用作变量时,会出现各种奇怪且令人困惑的错误: 一个更阴险的版本是: template <class T> struct A {

这绝对是一个奇怪的代码,所以如果这本书没有解释它,就烧掉这本书并要求退款。总结是:它不是一个模板。这是一个小于的比较,也是一个大于的比较

if(foo<1>(3))
您可能希望它使用默认构造的a创建一个名为obj的B,但它声明了一个名为obj的函数,该函数返回一个B,它的参数本身就是一个不接受任何内容并返回一个a的函数。然后,当您尝试将其用作变量时,会出现各种奇怪且令人困惑的错误:

一个更阴险的版本是:

template <class T>
struct A {
    static int v;
};
template<>
struct A<int>
    using v = float;
};
template<class T>
struct B {
    B() {
        A<T>::v;
    }
};

在B内部,很难(如果不是不可能的话)判断v是类型还是变量。这是一个非常糟糕的情况,C++必须添加一个特殊的关键字类型名称,这样程序员就可以告诉编译器它实际上是一个类型,因为编译器总是假设它是一个变量。

这是一个完全离奇的代码,所以如果书没有解释它,就烧掉书,要求退款。总结是:它不是一个模板。这是一个小于的比较,也是一个大于的比较

if(foo<1>(3))
您可能希望它使用默认构造的a创建一个名为obj的B,但它声明了一个名为obj的函数,该函数返回一个B,它的参数本身就是一个不接受任何内容并返回一个a的函数。然后,当您尝试将其用作变量时,会出现各种奇怪且令人困惑的错误:

一个更阴险的版本是:

template <class T>
struct A {
    static int v;
};
template<>
struct A<int>
    using v = float;
};
template<class T>
struct B {
    B() {
        A<T>::v;
    }
};


在B内部,很难(如果不是不可能的话)判断v是类型还是变量。这是一个非常糟糕的情况,C++必须添加一个特殊的关键字类型名,这样程序员就可以告诉编译器它实际上是一个类型,因为编译器总是假设它是一个变量。不是,好的。那么这意味着什么呢?变量和类型名是独立的。语言语法允许它根据上下文确定foo是变量还是类型/模板。1+2是什么意思?4<3是什么意思?这些都是你可以从语言语法中得到的东西…@AmirJalilifard在他的答案下面的MooingDuck评论中,这本书是否在后面解释了示例中没有涉及模板?还是你一看到这个例子就停止阅读,冲过去发问?int-var是如何用作模板的?不是,好的。那么这意味着什么呢?变量和类型名是独立的。语言语法允许它根据上下文确定foo是变量还是类型/模板。1+2是什么意思?4<3是什么意思?这些都是你可以从语言语法中得到的东西…@AmirJalilifard在他的答案下面的MooingDuck评论中,这本书是否在后面解释了示例中没有涉及模板?或者你一看到这个例子就停止阅读,冲过去发问了吗?不管foo的价值是什么,second永远都是假的。真不敢相信书中竟然有这样的例子!我支持你。烧掉这本书。@Praetorian:我想这本书会说类似的东西看起来像一个模板,但实际上是两个比较运算符很好!我会盯着那个代码看很长时间,然后才知道它在做什么。我还没有读过这本书,但我猜这是在一篇文章中讨论了C++中的空白是怎么回事。阿米尔:这不是一个模棱两可的问题:如果在较窄的范围内声明,int-foo将隐藏模板foo,如果在相同的范围内声明,则会导致编译器错误。foo的值是什么都不重要,second将始终为false。真不敢相信书中竟然有这样的例子!我支持你。烧掉这本书。@Praetorian:我想这本书会说类似的东西看起来像一个模板,但实际上是两个比较运算符很好!我会盯着那个代码看很长时间,然后才知道它在做什么。我还没有读过这本书,但我猜这是在一篇文章中讨论了C++中的空白是怎么回事。阿米尔:这不是歧义:如果在较窄的范围内声明,int-foo将隐藏模板foo,如果在相同的范围内声明,则会导致编译器错误。
struct A {};
struct B {
    B(A a) {}
};
int main() {
    B obj(A());
template <class T>
struct A {
    static int v;
};
template<>
struct A<int>
    using v = float;
};
template<class T>
struct B {
    B() {
        A<T>::v;
    }
};