gpt4 book ai didi

c++ - 默认模板参数的 "Redefinition"

转载 作者:可可西里 更新时间:2023-11-01 17:46:11 25 4
gpt4 key购买 nike

对于以下使用 Visual C++ 2010 的代码,我有一个奇怪的编译警告:

#include <iostream>

class test
{
public:
template<class obj>
class inner
{
private:
// Line 11:
template<int index, bool unused = true> struct AttributeName;

private:
template<bool b>
struct AttributeName<0,b>
{
static inline const char* get()
{
return "prop";
}
};

public:
typedef AttributeName<0> propname;
};
typedef inner<test> description;
};

int main()
{
test t;
std::cout << test::description::propname::get(); // Line 32
return 0;
}

警告:

file.cpp(11) : warning C4348: 'test::inner<obj>::AttributeName' : redefinition of default parameter : parameter 2 (with [ obj=test ])
file.cpp(11) : see declaration of 'test::inner<obj>::AttributeName' (with [ obj=test ])
file.cpp(32) : see reference to class template instantiation 'test::inner<obj>' being compiled (with [ obj=test ])

我不明白的是 AttributeName“重新定义”与定义在同一行...听起来像个错误

我注意到将 inner 设为非模板类​​会删除警告。但是,这不是一个选项,因为实际代码比这个测试用例更复杂,需要模板化。

此外,如果将警告视为错误,则此代码将无法编译...

It compiles without warnings on GCC .

为什么 msvc 输出这样的警告,是否有解决方法?

编辑

以下修改:

template<int index, bool unused = true> struct AttributeName {};

似乎删除了警告。

最佳答案

这主要是一个猜测,因为这似乎解决了(?)它:

template<int index, bool unused = true> struct AttributeName;
template<int index, bool unused> struct AttributeName
{
};

我的猜测是前向声明既被视为声明又被视为“定义”,因为它看不到任何其他内容,因此它提示默认值被“重新定义”,即使它是同一行。可能是无意的,尽管 2012 年表现相同。

关于c++ - 默认模板参数的 "Redefinition",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12656239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com