默认模板参数的“再定义”(“Redefinition” of default template pa

2019-09-23 05:46发布

我有下面的代码编译怪警告,使用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 “重新定义”是在同一行比定义......听起来像一个bug

我注意到,使得inner非模板类中删除警告。 然而,由于真正的代码比这测试用例更加复杂,需要进行模板化,这是不是一种选择。

另外,如果警告被视为错误的代码不会编译...

它编译没有在GCC的警告 。

为什么MSVC是outputing这样的警告,是有解决方法吗?

编辑

以下修改:

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

似乎抹去的警告。

Answer 1:

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

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

我的猜测是向前声明被看作是双方的声明和“定义”,因为它无法看到任何东西,因此它抱怨缺省设置为“重新定义”即使它是在同一行。 可能是无意的,但2012行为相同。



文章来源: “Redefinition” of default template parameter