我正在处理一个涉及 TOM 文件(.t 扩展名)的项目,这些文件被编译成 .c 文件。现在,我已经告诉我的 Eclipse 将它们视为 C 源文件,但是 CDT 索引器似乎不想接触它们。是否可以告诉它考虑其他文件类型?
注意:TOM 文件看起来就像 C 文件,但有一些额外的语法,这对于索引器来说就像某些行上的语法错误。
我有一些代码大量使用模板类.此时可能但不希望更改现有代码库.我需要编写一个新的类,它将作用于两个模板类(为了这个问题的目的)是任意的,除了有一个共同的模板参数.一个简化的例子:
template<typename T>
class A {
// Implementation details
};
template<typename T>
class B {
// Implementation details
};
template<typename T, typename X<T>, typename Y<T>> // This syntax is invalid!
class C {
// Implementation details
};
Run Code Online (Sandbox Code Playgroud)
我需要写课C.示例中显示的语法暗示了我想要做什么但不起作用.模板参数X和Y这里必须通过采用相同的模板参数"捆绑在一起" T.除此之外,它们可以是任意的.
这意味着"喜欢"的东西C<std::string,A<std::string>,B<std::string>>应该是有效的,但C<std::string,A<std::string>,B<std::map>>不应该因为A并且B没有相同的模板参数.(引号中的"like"再次表示语法在C上面的声明中仍然是错误的.)
其他尝试(也失败了)包括:
template<typename T, template<typename> class X<T>, template<typename> class Y<T>>template<typename T> template<typename X<T>, typename Y<T>>有可能这样吗?如果是这样,语法是什么?
谢谢!
在C++中,许多开发人员(甚至可能是我们大多数人)不喜欢宏,并试图避免使用正确的语言结构.并且 - 似乎语言也倾向于鼓励这一点.渐渐地,我们已经能够在很多情况下摆脱宏观使用:
#include警卫 - > #pragma once对于一些编译器,虽然我猜你不能相信; 很快我们应该有C++ 17模块而import不是include.我的问题是 - 还剩下什么?什么样的宏观使用是完全不可避免的,或者是非常痛苦的避免?我能想到的主要例子是:
使用文件名,行号和函数/方法名称:
#define LOG(whatever, ...) log(__FUNCTION__, __FILE__, __LINE__, whatever, VA_ARGS)
Run Code Online (Sandbox Code Playgroud)用于将代码块作为"参数"的语法糖,例如
AT_SCOPE_EXIT { release_resource(); }
Run Code Online (Sandbox Code Playgroud)
在Andrei Alexandrescu的ScopeGuard中(或观看视频).虽然我想我们真的不需要使用简洁的宏使用伪语法.
我错过了宏的其他重要用途?(请不要超级特殊的角落情况.)
我有一个模板函数,它接受两种数据类型 - int和double并返回一个较小的数据,现在,我如何推断出这个函数返回的类型?现在,我正在丢失小数点后的部分.
#include <iostream>
using namespace std;
template <class First, class Second>
First smaller(First a, Second b){
return (a < b ? a : b);
}
int main () {
int x = 100;
double y = 15.5;
cout<< smaller (x,y) << endl;
}
Run Code Online (Sandbox Code Playgroud) CUDA PTX 指南描述了指令“atom”和“red”,它们执行原子和非原子归约。这对我来说是新闻(至少对于非原子归约而言)...我记得不久前学习过如何使用 SHFL 进行归约。这些指令是否以某种方式反映或包装在 CUDA 运行时 API 中?或者使用 C++ 代码访问而无需实际编写 PTX 代码的其他方式?
我想编写C宏,它接受一个整数文字或类似于整数文字的东西,以及另一个宏的名称,并将该其他宏扩展为整数字面值的多倍,索引作为参数,例如
MAGIC(4, FUN)
Run Code Online (Sandbox Code Playgroud)
扩展到
FUN(0) FUN(1) FUN(2) FUN(3)
Run Code Online (Sandbox Code Playgroud)
相反,如果我的MORE_MAGIC需要一个范围的起点和长度,那就更好了:
例如
MORE_MAGIC(1, 3, FUN)
Run Code Online (Sandbox Code Playgroud)
扩展到
FUN(1) FUN(2) FUN(3)
Run Code Online (Sandbox Code Playgroud)
注意:
我有一些调用的内核代码memcpy(my_dst, my_src, my_num_bytes)- 有时我my_num_bytes等于0.奇怪的是,一些零星的实验(使用Titan X,CUDA 7.5,驱动程序358.16)表明,当我这样的调用时,数据会被写入目的地.
memcpy() 不说.我已经阅读了OpenCL 2.x管道API的这个描述,并通过khronos.org上的Pipe API页面引导.我觉得有点嫉妒,几乎完全在CUDA工作,这个漂亮的功能仅在OpenCL中可用(并且抱歉CUDA功能未被OpenCL正确包含,但这是一个不同的问题),所以我想我会问"如何来CUDA没有管道机制".但后来我意识到我甚至都不知道那究竟是什么意思.所以,相反,我会问:
OpenCL管道如何在AMD独立GPU/APU上运行?...
我正在尝试使用GCC 6.2.1构建一些CUDA代码,这是我的发行版的默认编译器(注意:不是CUDA正式支持的GCC版本,所以你可以称之为实验).这是使用GCC 4.9.3和CUDA版本7.5和8.0构建的代码.
好吧,如果我构建以下(接近)最小的示例:
#include <tuple>
int main() { return 0; }
Run Code Online (Sandbox Code Playgroud)
使用命令行
nvcc -std=c++11 -Wno-deprecated-gpu-targets -o main main.cu
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
/usr/local/cuda/bin/../targets/x86_64-linux/include/math_functions.h(8897): error: cannot overload functions distinguished by return type alone
/usr/local/cuda/bin/../targets/x86_64-linux/include/math_functions.h(8901): error: cannot overload functions distinguished by return type alone
2 errors detected in the compilation of "/tmp/tmpxft_000071fe_00000000-9_b.cpp1.ii".
Run Code Online (Sandbox Code Playgroud)
这是为什么?我该如何纠正/规避这个?
这些工作:
struct WithString {
WithString(std::string){};
};
void takeString(std::string){}
//implicit conversions:
takeString("hello");
WithString("hello");
Run Code Online (Sandbox Code Playgroud)
但这不是:
WithString makeWithString() { return "hello";}
// error: no viable conversion from returned value of type 'const char [6]'...
Run Code Online (Sandbox Code Playgroud)
如果std::string在前两种情况下隐式转换为"hello" ,为什么不能在最后一种情况下呢?请注意,我没有将WithString构造函数指定为explicit,所以我希望这样的转换.
通过这样做,我可以让行为起作用:
struct WithString {
WithString(std::string){};
WithString(const char *){};
};
Run Code Online (Sandbox Code Playgroud)
我只是对这种奇怪感到好奇.如果我假定一个猜测,我会说这是因为前两个工作的情况下,转换之间const char *到std::string,但在错误的情况下,这反而会需要2转换链,首先从const char *到std::string,然后从std::string到WithString.也许这就是原因,但我不确定.
c++ stdstring object-construction implicit-conversion char-pointer