C++ 函数接受模板类的内部类时出现问题
我对类模板中的内部类有问题。我有一个模板类(比如:C++ 函数接受模板类的内部类时出现问题,c++,templates,C++,Templates,我对类模板中的内部类有问题。我有一个模板类(比如:Matrix)和一个子类(比如:Matrix::Row)。现在我想写一个函数,它在子类的实例上运行(比如:negate(Matrix::Row&))。我试图用模板否定(typename Matrix::Row&)声明函数,但当我尝试使用它时,编译器告诉我它找不到匹配项 下面是一个抽象的例子: template<class T> class A { public: class B { }; }; templat
Matrix
)和一个子类(比如:Matrix::Row
)。现在我想写一个函数,它在子类的实例上运行(比如:negate(Matrix::Row&)
)。我试图用模板否定(typename Matrix::Row&)
声明函数,但当我尝试使用它时,编译器告诉我它找不到匹配项
下面是一个抽象的例子:
template<class T>
class A
{
public:
class B
{
};
};
template<class T>
void x(typename A<T>::B &)
{
}
int main()
{
A<int>::B b;
x(b); // doesn't work: Error: Could not find a match
// for x<T>(A<int>::B) needed in main().
x<int>(b); // works fine
}
模板
甲级
{
公众:
B类
{
};
};
模板
void x(类型名A::B&)
{
}
int main()
{
A::B;
x(b);//不工作:错误:找不到匹配项
//对于main()中需要的x(A::B)。
x(b);//工作正常
}
为什么编译器在第一种情况下无法找到x
?是否有一种方法可以修改它(不显式指定类型int
)
(我也有类似的问题,x
的形式是template void x(typename A::B&,const S&);
,我真的不想在调用时被迫显式命名所有类型。)
我已经在g++4.4.3、g++4.5.2和Sun Studio 5.9中尝试过这一点,它们都给出了相同的结果。提前非常感谢您的帮助 这是不可推断的上下文。这就是编译器无法推导模板参数的原因 想象一下,您可能有如下专门化的
A
:
template <>
struct A<SomeType>
{
typedef std::map <double, double> B;
};
甚至这种专门化也将B
作为嵌套类型
现在如果我说
A::B
是std::map
,那么你能说T
是什么吗?它是某种类型的吗?或者其他类型的
?不可推断的上下文。这就是编译器无法推导模板参数的原因
想象一下,您可能有如下专门化的A
:
template <>
struct A<SomeType>
{
typedef std::map <double, double> B;
};
甚至这种专门化也将B
作为嵌套类型
现在如果我说
A::B
是std::map
,那么你能说T
是什么吗?它是某种类型的吗?或者SomeOtherType
?需要为模板函数x的调用推导类型T,并且模板参数推导仅在一组特定的情况下允许:
A::B
似乎不是其中之一:/需要为模板函数x的调用推断类型T,并且模板参数推断仅在特定的情况下才允许:
A::B
似乎不是其中之一:/编译器应该如何推断这一点?设想以下设置:
struct A { typedef int T; };
struct B { typedef int T; };
template <typename S> void foo(typename S::T);
struct A{typedef int T;};
结构B{typedef int T;};
模板void foo(typename S::T);
现在当你说intx;foo(x)代码>,无法明确地匹配这一点
关键是,您并不是从给定的类模板推导模板参数,而是一个任意的、独立的类型。该类型是在另一个类中定义的这一事实与此无关。编译器应该如何推断这一点?设想以下设置:
struct A { typedef int T; };
struct B { typedef int T; };
template <typename S> void foo(typename S::T);
struct A{typedef int T;};
结构B{typedef int T;};
模板void foo(typename S::T);
现在当你说intx;foo(x)代码>,无法明确地匹配这一点
关键是,您并不是从给定的类模板推导模板参数,而是一个任意的、独立的类型。该类型是在另一个类中定义的这一事实与此无关。+1表示的是+1,表示的是+1,这是有意义的;谢谢我想我会把我的类Matrix::Row改为MatrixRow,这可能是解决我问题的最好办法;谢谢我想我会把我的类Matrix::Row改为MatrixRow,这可能是解决我问题的最好办法。谢谢你的回答!我希望,因为在我的代码中,只有一种方法可以解析它,编译器会这样做。但我错了…谢谢你的回答!我希望,因为在我的代码中,只有一种方法可以解析它,编译器会这样做。但我错了。。。