以下是无效代码:
struct foo {
struct bar;
bar x; // error: field x has incomplete type
struct bar{ int value{42}; };
};
int main() { return foo{}.x.value; }
Run Code Online (Sandbox Code Playgroud)
这很清楚,因为foo::bar在foo::x定义的点上被认为是不完整的.
但是,似乎有一个"解决方法"使相同的类定义有效:
template <typename = void>
struct foo_impl {
struct bar;
bar x; // no problems here
struct bar{ int value{42}; };
};
using foo = foo_impl<>;
int main() { return foo{}.x.value; }
Run Code Online (Sandbox Code Playgroud)
这适用于所有主要编译器.我有三个问题:
template)被认为是无效的?如果编译器可以找出第二个选项,我没有看到为什么它无法找出第一个选项的原因.如果我添加一个明确的专业化void:
template <typename = void>
struct …Run Code Online (Sandbox Code Playgroud) 从这里看来,C不支持默认参数.
我在导出的库中有以下方法:
extern "C"
{
__declspec (dllexport) uintptr_t Method(int freq, int *pRetval, bool *support2MHz);
}
Run Code Online (Sandbox Code Playgroud)
如果我使最后一个参数可选像这样:
extern "C"
{
__declspec (dllexport) uintptr_t Method(int freq, int *pRetval, bool *support2MHz = NULL);
}
Run Code Online (Sandbox Code Playgroud)
我的dll仍在编译中.我的问题是为什么?每个人都说C代码不支持默认参数.
我使用C++ for MS 2015.
在编译使用 Google Test 的 CUDA 程序时,nvcc会发出误报警告:
函数 <name> 已声明但从未被引用
一个 MCVE:
// test.cu
#include <gtest/gtest.h>
namespace {
__global__ void a_kernel() {
printf("Works");
}
TEST(ExampleTest, ExampleTestCase) {
a_kernel<<<1, 1>>>();
}
}
Run Code Online (Sandbox Code Playgroud)
编译它给出:
$ nvcc test.cu -lgtest -lgtest_main
test.cu(9): warning: function "<unnamed>::ExampleTest_ExampleTestCase_Test::ExampleTest_ExampleTestCase_Test()" was declared but never referenced
Run Code Online (Sandbox Code Playgroud)
这在 google test 和 CUDA 9.1 的 master 分支中得到了确认(我相信它是从 CUDA 9.0 开始发生的,并且该错误在 CUDA 8.0 中不存在)。如果测试在全局命名空间中,则不会发生此问题。
有没有办法禁用这些警告?我知道我可以-w用来禁用所有警告,但我想保留其他类型的警告。