小编Gor*_*gar的帖子

类中不允许使用不完整类型,但允许在类模板中使用

以下是无效代码:

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::barfoo::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)

适用于所有主要编译器.我有三个问题:

  1. 这确实是有效的C++代码,还是只是编译器的一个怪癖?
  2. 如果它是有效的代码,C++标准中是否有一个处理此异常的段落?
  3. 如果它是有效代码,为什么第一个版本(不template)被认为是无效的?如果编译器可以找出第二个选项,我没有看到为什么它无法找出第一个选项的原因.

如果我添加一个明确的专业化void:

template <typename = void>
struct …
Run Code Online (Sandbox Code Playgroud)

c++ templates forward-declaration language-lawyer c++11

21
推荐指数
2
解决办法
1764
查看次数

extern"C"默认参数是否有效?

这里看来,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.

c c++ arguments extern

8
推荐指数
1
解决办法
719
查看次数

如何隐藏 NVCC 的“函数已声明但从未被引用”警告?

在编译使用 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用来禁用所有警告,但我想保留其他类型的警告。

cuda googletest nvcc

5
推荐指数
1
解决办法
889
查看次数