私有类专门化错误
Private class specialization error
在clang中编译下面的代码时,我有警告(在vc++中可以正常工作):
警告:'Helper'在类范围内的显式特化是一个Microsoft扩展[-Wmicrosoft]
#include <stdio.h>
#include <string>
enum class Car { BMW };
class C
{
static void Method() { puts("inner");}
};
template<typename T>
class BaseClass
{
private:
template<typename V>
struct Helper;
template<>
struct Helper<Car>
{
typedef C InnerType;
static const char* Name() { return "Car"; }
};
typedef Helper<T> Info;
typedef typename Info::InnerType InnerType;
private:
T v;
protected:
BaseClass()
{ }
public:
T Value() const { return v; }
std::string Name() const { return Info::Name(); }
static void Print() { InnerType::Method(); }
};
class MyCar : public BaseClass<Car>
{
public:
MyCar() : BaseClass() {}
};
int main()
{
MyCar a;
printf("%sn", a.Name().c_str());
// a.Print();
}
我已经尝试将Helper类的专门化移出BaseClass
以与标准兼容:
template<> template<>
struct BaseClass<Car>::Helper<Car>
{
typedef C InnerType;
static const char* Name() { return "Car"; }
};
但是现在我有编译错误:
错误:未定义模板的隐式实例化'BaseClass::Helper'
如果我删除行:typedef typename Info::InnerType InnerType;
(以及函数Print
中的相关用法),那么一切都工作正常。
有可能修复这个错误吗?我想保持我的Helper
类为私有
你可以这样做:
#include <stdio.h>
#include <string>
enum class Car { BMW };
class C
{
static void Method() { puts("inner");}
};
template<typename T>
class BaseClass
{
private:
template<typename V>
struct Helper;
template<typename V>
using Info = Helper<V>;
template<typename V>
using InnerType = typename Info<V>::InnerType;
private:
T v;
protected:
BaseClass()
{ }
public:
T Value() const { return v; }
std::string Name() const { return Info<T>::Name(); }
static void Print() { InnerType<T>::Method(); }
};
template<> template<>
struct BaseClass<Car>::Helper<Car>
{
typedef C InnerType;
static const char* Name() { return "Car"; }
};
class MyCar : public BaseClass<Car>
{
public:
MyCar() : BaseClass() {}
};
int main()
{
MyCar a;
printf("%sn", a.Name().c_str());
//a.Print();
}
(gcc 5.1/clang 3.6, -std= c++ 11)
程序打印"Car"
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- 线程 std::调用未知类型,无法专门化函数错误
- 错误 C2893 无法专门化函数模板'unknown-type std::invoke(_Callable &&,_Types &&...)'
- 如果模板的错误代码在If(false)中,我必须专门化模板吗
- 错误:T没有命名类型-用于使用强类型枚举的专门化
- 显式函数模板专门化选择了错误的专门化
- 下面的模板专门化代码是非标准的,或者是vs - c++中的错误
- 为类的trait专门化实现错误消息
- 当试图用另一个类模板部分专门化一个类模板时,在VS2013中出现错误
- 部分和显式模板专门化的奇怪错误
- 防止模板部分专门化错误
- 模板专门化GCC的语法错误,但MSVC没有
- 在cpp文件中实现模板专门化导致Template -id does not match错误
- 模板专门化语法错误?不确定
- 私有类专门化错误
- 一个模板专门化用于pod,一个模板专门化用于类层次结构,在其他情况下出现错误
- GCC错误:在非命名空间范围内显式专门化
- 模板方法专门化链接错误