La respuesta es sencilla, los vectores (y en general los array) cuando se usan como parametro en C/C++, se pasan por referencia (como si fueran punteros), y no por valor. Recordando:
1. Parametros por valor: se copia todo el contenido de la variable en la pila de la funcion:
2. Parametros por referrencia: se copia la direccion en donde se encuentra la variable en la pila de la funcion. Si es un vector, solo se copia la direccion del primer elemento del vector.
Por lo tanto, dado que solo tenemos la direccion del primer elemento, es imposible saber la longitud total del vector, y ademas como dije antes en realidad lo que se pasa es un puntero, entonces sizeof solo nos dara el tamaño del puntero, no el tamaño del pirmer elemento, ni tampoco el tamaño de todos los elementos.
Ahora en respuesta a tu pregunta:
como sacar el tamaño de un vector en un archivo aparte
No es posible sacar el tamaño, dado que como dije antes los vectores cuando se pasan como parametros a las funciones se comportan como punteros. Esa es la razon por la cual cuando se pasa un vector a una funcion, generalmente tambien se le pasa como parametro el tamaño del vector:
int f (int v [], int tam)
Ahora diras ¿y como es entonces que la funcion strlen() me devuelve el tamaño del vector de caracteres (cadena) sin pasarle yo el tamaño? ah, en ese caso recuerda que las cadenas terminan con nulo '\0', entonces strlen lo que hace es que cuenta los caracteres y se detiene cuando llega al nulo, de esa forma encuentra el tamaño de la cadena.
Entonces, a menos que le pases como parametro el tamaño de tu vector a la funcion, o utilices algun tipo de marcador como en el caso de las cadenas, para indicarle que llego al final del vector, no hay manera de saber el tamaño de un vector pasado como parametro.
Saludos