gcc4模板错误或更可能是id10t错误

use*_*067 5 c++ compiler-construction gcc templates gcc4

以下代码在Visual Studio下编译得很好,但gcc 4.6.2或4.7都无法处理它.它似乎是有效的,但gcc似乎无法解决const和非const参数之间的区别.这可能是编译器错误吗?

struct CReadType{};
struct CWriteType{};

template<typename ReadWriteType, typename T> 
struct AddPkgrConstByType {}; 
template<typename T> 
struct AddPkgrConstByType<CReadType, T> {
   typedef T type;
};    
template<typename T>
struct AddPkgrConstByType<CReadType, const T> {
    typedef T type;
};
template<typename T>
struct AddPkgrConstByType<CWriteType, T> {
    typedef T const type;
};

template<typename Packager, typename T>
struct AddPkgrConst : public AddPkgrConstByType<typename Packager::CReadWriteType, T> {
};

template<typename Packager, typename T>
inline bool Package( Packager* ppkgr, T* pt ) 
{
    return true;
}

template<typename Packager>
inline bool Package( Packager* ppkgr, typename AddPkgrConst<Packager,bool>::type* pb) 
{
    return false;
}

struct ReadPackager {
    typedef CReadType CReadWriteType;
};
struct WritePackager {
    typedef CWriteType CReadWriteType;
};

int main(int argc, char* argv[])
{
    ReadPackager rp;
    WritePackager wp;
    bool b = true;
    const bool cb = false;
    Package( &rp, &b );
}
Run Code Online (Sandbox Code Playgroud)

编译器调用:

g++ -fPIC -O -std=c++0x -Wno-deprecated -D_REENTRANT 
g++-D__STDC_LIMIT_MACROS -c test.cpp
test.cpp: In function ‘int main(int, char**)’:
test.cpp:58:22: error: call of overloaded ‘Package(ReadPackager*, bool*)’ is ambiguous
test.cpp:58:22: note: candidates are:
test.cpp:31:6: note: bool Package(Packager*, T*) [with Packager = ReadPackager, T = bool]
test.cpp:38:6: note: bool Package(Packager*, typename AddPkgrConst<Packager, bool>::type*) [with Packager = ReadPackager, typename AddPkgrConst<Packager, bool>::type = bool]
Run Code Online (Sandbox Code Playgroud)

bit*_*ask 3

我不知道 Visual Studio 有什么问题,但gcc所说的似乎是正确的:

您实例化是AddPkgrConstByType<CReadType, T>因为Packager::CReadWriteType解析为CReadType. 因此,AddPkgrConst<Packager,bool>::type将根据第一个实现(这不是专门化)解决bool。这意味着您有两个具有相同参数列表的独立函数专业化,这是 C++ 不允许的。