The following code is a minimal example of what I am trying to do. When I compiled it with

Visual C++ 2008 Express, I got the error:

main.cpp(62) : error C2677: binary '*' : no global operator found which takes type 'Point<T>' (or there is no acceptable conversion)

1> with

1> [

1> T=float

1> ]

1> main.cpp(68) : see reference to function template instantiation 'void foo<float,double>(T,T,T)' being compiled

1> with

1> [

1> T=float

1> ]

**However**, if I change foo so that it does not take any parameter, the error will be gone.

Could anyone tell me where I am wrong? Thanks

```
template<class T>
class Point {
private:
T x, y, z;
public:
Point(T xx, T yy, T zz) : x(xx), y(yy), z(zz) {}
template<class U> operator Point<U> () const { return Point<U>( U(x), U(y), U(z) ); }
};
template<class T>
class Matrix{
private:
T m[16];
public:
Matrix(T x, T y, T z){}
Point<T> operator* (const Point<T>& p) { return Point<T>(0,0,0); }
};
/* this does not work */
template<class T, class C>
void foo(T x, T y, T z)
{
Point<T> o1(0,0,0);
Matrix<C> m(C(x),C(y), C(z));
m * o1;
}
/*but this does work
template<class T, class C>
void foo()
{
Point<T> o1(0,0,0);
Matrix<C> m(C(1),C(1), C(1));
m * o1;
}
*/
int main()
{
foo<float,double>(1,1,1); // failed
// foo<float,double>(); works
return 0;
}
```